none
Visual C++で関数のトレースをしたい RRS feed

  • 質問

  • Visual C++で関数のトレースをしたいのですが、

    BasicTRONTROFFみたいに関数の実行履歴のログをとるにはどうすればよいでしょ

    う?

     

    2010年4月23日 0:11

回答

  • リンク先の内容はあくまで、C++/CLI (CLR プロジェクト)として作る場合に利用できます。
    元々のプロジェクトが、Win32 プロジェクトや MFC プロジェクトなどである場合は利用できないと思ってください。
    (CLR プロジェクトに変えていけば利用できますが、トレースのために C++/CLI に移植するのは何か間違っているように思います)

    出力ペインにデバッグ情報を残すのであれば、Win32 プロジェクトでは OutputDebugString という API を、MFC であれば TRACE マクロもありです。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年4月28日 10:08
    • 回答としてマーク 山本春海 2010年4月30日 1:59
    2010年4月23日 15:14
    モデレータ
  • 設定済みのつもりでしたか、すいません。

    関数呼び出しの履歴が欲しいということになると、元の KB の内容はかなり目的と離れてしまっているのではないかと思います。CLR (.NET) アプリケーションなのか、native アプリケーションなのかによってアプローチはかわってきますが、自分でつくるとなるとそれなりの知識が必要になります。(profile api とか透過プロキシとかあたりが手軽かな?)

    現状で、参照されている KB を読んで、その内容を自己解決できないレベルだと、出来合いのものを利用されるのが良いのではないか……と思いますが、商品としてパッケージ化されているものから無償で配布されているものまで、探せばいくつかあるのではないかと思います。

    ただ、無償で配布されているものの多くは、ある程度の理解がある人のための糸口としての簡易ツールであったりしますし、商品として売られているものはそれなりに高価なものも多いかんじの分野です。
    (用途次第では安価で使いやすいものもありますけどね)

    そもそも、何を目的として、どうして実行履歴を知るようなことが必要になったのか? といったところから書かれてみたほうがいいのではないかと思います。案外、単にデバッガでステップ実行するだけでも十分なことだったりしませんか。

    • 回答の候補に設定 山本春海 2010年4月28日 10:09
    • 回答としてマーク 山本春海 2010年4月30日 1:59
    2010年4月27日 14:14
  • ご提案した”Win32 プロジェクトでは OutputDebugString ”の方法は、すべての関数内に書くのが、あまり大規模なソースコードなので、現実的に。。。
    なにか一か所スイッチONを設定し、後自動的に関数の実行履歴をリストやファイルに記録してくれたら。。。こういう方法がほしいですね。

    参照されているサポート情報の手法でも、実行履歴やリストを勝手に保存してくれるわけではありません。
    サポート情報はあくまで、このような関数でデバッグログに書き出せるよと言うことを示しているだけであり、実際に書き出すコードを埋め込んでいくことが必要です。
    このため、CLR を単に使うだけでは、「すべての関数内に書くのが、あまり大規模なソースコードなので、現実的に。。。」と同じ状況です。

    また、CLR オプションでコンパイルすると、.NET Framework が必要になります。
    もし、ネイティブアプリケーションとして作っていたのに、今回 CLR オプションをつけたのであれば、実行環境の要件が変わってしまう点にもご注意ください。

    # 求めているのは、AOP 的な考え方なのかなぁ。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年4月28日 10:09
    • 回答としてマーク 山本春海 2010年4月30日 2:00
    2010年4月27日 15:10
    モデレータ

すべての返信

  • 補足:

    現在状況:

    OS:Window XP

    TOOL: Visual Studio 2005 Standard Edition

    http://support.microsoft.com/kb/815787/ja

    を参考して、完全なコード リストよりConInfo.cppを作成し、ビルドをしたら

    error C3699: '*' : この間接指定を型 'System::String' で使用できません
            コンパイラは、解析を続行するために '*' を '^' で置き換えます

    error C3921: S プレフィックスの付いた文字列の使用には、/clr:oldSyntax コマンド ライン オプションが必要です
            /clr でコンパイルするときに、文字列リテラル型から System::String^ への暗黙的な変換が存在します。あいまいさを避けなければならない場合は、System::String^ へキャストしてください

    error C2440: '初期化中' : 'System::Xml::XmlDocument *' から 'System::Xml::XmlDocument ^' に変換できません。
            使用可能なユーザー定義された変換演算子がない、または
            アンマネージ型をマネージ型に変換できません。

    error C2750: 'System::Diagnostics::TextWriterTraceListener' : 参照型では 'new' を使用できません。'gcnew' を使用してください

    ....

    などエラーが出る

    ConInfo.cpp
    リンクしています...
    LINK : fatal error LNK1561: エントリー ポイントを定義しなければなりません。

    うまくいきません。

    原因と解決方法が分かる方が教えてください。よろしくお願いします。

     

    2010年4月23日 0:52
  • リンク先の内容はあくまで、C++/CLI (CLR プロジェクト)として作る場合に利用できます。
    元々のプロジェクトが、Win32 プロジェクトや MFC プロジェクトなどである場合は利用できないと思ってください。
    (CLR プロジェクトに変えていけば利用できますが、トレースのために C++/CLI に移植するのは何か間違っているように思います)

    出力ペインにデバッグ情報を残すのであれば、Win32 プロジェクトでは OutputDebugString という API を、MFC であれば TRACE マクロもありです。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年4月28日 10:08
    • 回答としてマーク 山本春海 2010年4月30日 1:59
    2010年4月23日 15:14
    モデレータ
  • おそらく、内容からして新規のプロジェクトで KB に書かれた内容の確認をされているのだと思いますが、エラー内容からして、KB の「完全なコードリスト」のソースコードの下に書いてある「共通言語ランタイム サポート コンパイラ オプションを追加する」の手順を実行しわすれているのではないかと思います。

     

    2010年4月24日 2:14
  • Azulean様:

    返事が遅れまして、すみませんでした。

    ご提案した”Win32 プロジェクトでは OutputDebugString ”の方法は、すべての関数内に書くのが、あまり大規模なソースコードなので、現実的に。。。

    なにか一か所スイッチONを設定し、後自動的に関数の実行履歴をリストやファイルに記録してくれたら。。。こういう方法がほしいですね。

     

    2010年4月27日 0:02
  • K.Takaoka様:

    返事が遅れまして、すみません。

    「共通言語ランタイム サポート コンパイラ オプションを追加する」の手順に沿って設定したつもりでした。なにが間違いどか注意点とかあるでしょうか?

     

     

    2010年4月27日 0:04
  • 設定済みのつもりでしたか、すいません。

    関数呼び出しの履歴が欲しいということになると、元の KB の内容はかなり目的と離れてしまっているのではないかと思います。CLR (.NET) アプリケーションなのか、native アプリケーションなのかによってアプローチはかわってきますが、自分でつくるとなるとそれなりの知識が必要になります。(profile api とか透過プロキシとかあたりが手軽かな?)

    現状で、参照されている KB を読んで、その内容を自己解決できないレベルだと、出来合いのものを利用されるのが良いのではないか……と思いますが、商品としてパッケージ化されているものから無償で配布されているものまで、探せばいくつかあるのではないかと思います。

    ただ、無償で配布されているものの多くは、ある程度の理解がある人のための糸口としての簡易ツールであったりしますし、商品として売られているものはそれなりに高価なものも多いかんじの分野です。
    (用途次第では安価で使いやすいものもありますけどね)

    そもそも、何を目的として、どうして実行履歴を知るようなことが必要になったのか? といったところから書かれてみたほうがいいのではないかと思います。案外、単にデバッガでステップ実行するだけでも十分なことだったりしませんか。

    • 回答の候補に設定 山本春海 2010年4月28日 10:09
    • 回答としてマーク 山本春海 2010年4月30日 1:59
    2010年4月27日 14:14
  • ご提案した”Win32 プロジェクトでは OutputDebugString ”の方法は、すべての関数内に書くのが、あまり大規模なソースコードなので、現実的に。。。
    なにか一か所スイッチONを設定し、後自動的に関数の実行履歴をリストやファイルに記録してくれたら。。。こういう方法がほしいですね。

    参照されているサポート情報の手法でも、実行履歴やリストを勝手に保存してくれるわけではありません。
    サポート情報はあくまで、このような関数でデバッグログに書き出せるよと言うことを示しているだけであり、実際に書き出すコードを埋め込んでいくことが必要です。
    このため、CLR を単に使うだけでは、「すべての関数内に書くのが、あまり大規模なソースコードなので、現実的に。。。」と同じ状況です。

    また、CLR オプションでコンパイルすると、.NET Framework が必要になります。
    もし、ネイティブアプリケーションとして作っていたのに、今回 CLR オプションをつけたのであれば、実行環境の要件が変わってしまう点にもご注意ください。

    # 求めているのは、AOP 的な考え方なのかなぁ。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年4月28日 10:09
    • 回答としてマーク 山本春海 2010年4月30日 2:00
    2010年4月27日 15:10
    モデレータ
  • K.Takaoka様:

     

    お付き合いしていただきまして、ありがとうございます。

    >商品としてパッケージ化されているものから無償で配布されているものまで、探せばいくつかあるのではないかと思います。

    無償のものがほしいですね。(あまりお金をかかりたくないですが、。。。)

    >そもそも、何を目的として、どうして実行履歴を知るようなことが必要になったのか?

    目的は、あるオープンソースを入手し、そのソースを分析し、アルゴリズム解析をしているところです。

    2010年4月28日 0:30
  • Azulean様:

    アドバイスをいただきまして、ありがとうございます。

    いろいろをやってみます。

    2010年4月28日 0:49