C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

profilerで呼び出し履歴が取れないでしょうか


(過去ログ 7 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■7277 / inTopicNo.1)  profilerで呼び出し履歴が取れないでしょうか
  
□投稿者/ ognac 二等兵(1回)-(2006/10/06(Fri) 00:51:48)

分類:[.NET 全般] 


分類:[.NET 全般] 

ognacです。掲示板に質問者デビューします。

過日、MSDNフォーラムで【CLI-Profilerの件. ですが, 関数HOOKの実装方法が理解できません。】主旨のスレがありました。
レスを期待していたのですが,レスが付かずに埋没したようです。
内容からの推測ですが,CLR_Profilerの事を言っていると察します。

以前、Profileを使って,呼び出し履歴が作れないかと,挑戦し挫折しました。
「デバッグテクニック徹底研究」には関数フックの話が載っていて,Enter/LeaveをHookすればよさげです。
 これと同様な機能が CLR Profilerで可能なのでしょうか。
CLR_Profileの利用サンプルコードを見る限りでは,Delegateが無いようなので,無理っぽいのですが。
呼び出し履歴が作れないものでしょうか、宜しくお願い致します。



0
引用返信 編集キー/
■7331 / inTopicNo.2)  Re[1]: profilerで呼び出し履歴が取れないでしょうか
□投稿者/ NyaRuRu 二等兵(3回)-(2006/10/06(Fri) 19:49:12)

分類:[.NET 全般] 

No7277に返信(ognacさんの記事)
> 以前、Profileを使って,呼び出し履歴が作れないかと,挑戦し挫折しました。
> 「デバッグテクニック徹底研究」には関数フックの話が載っていて,Enter/LeaveをHookすればよさげです。
>  これと同様な機能が CLR Profilerで可能なのでしょうか。
> CLR_Profileの利用サンプルコードを見る限りでは,Delegateが無いようなので,無理っぽいのですが。
> 呼び出し履歴が作れないものでしょうか、宜しくお願い致します。

何がやりたいのかよく分からないのですが,CLR Profiler に付属するソースコードを改良して機能を追加したいという話ですか?
この辺の API を使えば,呼び出し履歴の取得ぐらいは普通にできそうな気がしますけど.
http://msdn2.microsoft.com/ja-jp/library/ms233503.aspx

0
引用返信 編集キー/
■7340 / inTopicNo.3)  Re[2]: profilerで呼び出し履歴が取れないでしょうか
□投稿者/ ognac 二等兵(2回)-(2006/10/07(Sat) 00:32:21)

分類:[.NET 全般] 

No7331に返信(NyaRuRuさんの記事)

> 何がやりたいのかよく分からないのですが,CLR Profiler に付属するソースコードを改良して機能を追加したいという話ですか?
> この辺の API を使えば,呼び出し履歴の取得ぐらいは普通にできそうな気がしますけど.


NyaRuRu さん、ありがとうごさいます。

[デバッグテクニック徹底解説]の本によりますと, プロファインリングAPIの解説で、通知フラグの ENTERLEAVEでCALLBackを設定すると、
関数HOOKが可能で.下のクラスを実行すると,結果として, Trace実行結果 を作成することが可能が得られるとあります。
この機能を CLR_Profilerで出来ないのかと悩んでいます。
提示されたURLを熟読してみます。

------------------サンプルソース
class ThreadOne
{
public void EntryPoint ( )
{
Do ( ) ;
}

void Do ( )
{
Re ( ) ;
}

void Re ( )
{
Mi ( ) ;
}

void Mi ( )
{
Fa ( ) ;
}

void Fa ( )
{
So ( ) ;
}

void So ( )
{
La ( ) ;
}

void La ( )
{
Ti ( ) ;
}

void Ti ( )
{
Doh ( ) ;
}

void Doh ( )
{
MessageBeep ( -1 ) ;
}

[DllImport("user32.dll")]
private static extern Int32 MessageBeep ( Int32 uType ) ;
}
これを
private void BtnThreadOne_Click(object sender, System.EventArgs e)
{
ThreadOne c = new ThreadOne ( ) ;
Thread t = new Thread ( new ThreadStart ( c.EntryPoint ) ) ;
t.IsBackground = true ;
t.Name = "Thread One" ;
t.Start ( ) ;
}
で起動します。
--▼Trace実行結果

Thread 1 started at : 11:33:33:0846
FlowTest.ThreadOne.EntryPoint
FlowTest.ThreadOne.Do
FlowTest.ThreadOne.Re
FlowTest.ThreadOne.Mi
FlowTest.ThreadOne.Fa
FlowTest.ThreadOne.So
FlowTest.ThreadOne.La
FlowTest.ThreadOne.Ti
FlowTest.ThreadOne.Doh
System.Security.Permissions.SecurityPermission..ctor
System.Security.Permissions.SecurityPermission.VerifyAccess
System.Security.Permissions.SecurityPermission.VerifyAccess
System.Security.Permissions.SecurityPermission..ctor
FlowTest.ThreadOne.Doh
FlowTest.ThreadOne.Ti
FlowTest.ThreadOne.La
FlowTest.ThreadOne.So
FlowTest.ThreadOne.Fa
FlowTest.ThreadOne.Mi
FlowTest.ThreadOne.Re
FlowTest.ThreadOne.Do
FlowTest.ThreadOne.EntryPoint
Thread ended at : 11:33:33:0846

--▲Trace結果



0
引用返信 編集キー/
■7341 / inTopicNo.4)  Re[3]: profilerで呼び出し履歴が取れないでしょうか
□投稿者/ NyaRuRu 二等兵(4回)-(2006/10/07(Sat) 01:05:33)

分類:[.NET 全般] 

No7340に返信(ognacさんの記事)
> この機能を CLR_Profilerで出来ないのかと悩んでいます。

直接の回答がないので念押しですが,

CLR Profilerって,自身のソースコードついてきますよね.
http://www.microsoft.com/downloads/details.aspx?familyid=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en

1) 標準の CLR Profiler が,「この機能」をサポートしているのか知りたい
2) そのソースコードに書き加えて,「この機能」を追加する方法を知りたい

どっちでしょう?

0
引用返信 編集キー/
■7351 / inTopicNo.5)  Re[4]: profilerで呼び出し履歴が取れないでしょうか
□投稿者/ ognac 二等兵(3回)-(2006/10/07(Sat) 23:24:21)

分類:[.NET 全般] 

No7341に返信(NyaRuRuさんの記事)
ognacです。
> 1) 標準の CLR Profiler が,「この機能」をサポートしているのか知りたい

[「この機能」をサポートしているのか知りたい]です。


0
引用返信 編集キー/
■7376 / inTopicNo.6)  Re[5]: profilerで呼び出し履歴が取れないでしょうか
□投稿者/ NyaRuRu 二等兵(5回)-(2006/10/10(Tue) 00:30:36)

分類:[.NET 全般] 

No7351に返信(ognacさんの記事)
> [「この機能」をサポートしているのか知りたい]です。

CLR Profiler に呼出し履歴をテキストデータとして出力する機能はありませんが,コールツリーを時系列順に表示する機能はあります.
実行後に,View → Call Tree を選んでください.

ただし,JIT のインライン展開等により,ソースコード上のコールツリーと全く同じ結果が得られるとは限らないことに注意してください.
例えば手元の環境でテストしてみたところ,Debug ビルドでは EntryPoint → Do → Re と順番に呼び出されているように表示されましたが,Release ビルドでは EntryPoint からネイティブ関数 (MessageBeep) が直接呼び出されるように表示されました.
ソースコードに近いコールツリーが必要なのであれば,DebuggableAttribute や INI ファイルを使用してインライン展開を禁止してください.
http://msdn2.microsoft.com/ja-jp/library/9dd8z24x.aspx

0
引用返信 編集キー/
■7414 / inTopicNo.7)  Re[6]: profilerで呼び出し履歴が取れないでしょうか
□投稿者/ ognac 二等兵(4回)-(2006/10/11(Wed) 10:17:15)

分類:[.NET 全般] 

ognacです。ありがとうございました。

>ただし,JIT のインライン展開等により,ソースコード上のコールツリーと全く同じ結果が得られるとは限らないことに注意してください.
>例えば手元の環境でテストしてみたところ,Debug ビルドでは EntryPoint → Do → Re と順番に呼び出されているように表示されましたが,Release ビルドでは EntryPoint からネイティブ関数 (MessageBeep) が直接呼び出されるように表示されました.
 難解で使いこなせてませんが,動作の原理は掴めそうです。格好が付き次第報告させていただきます。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -