2011-08-10 4 views
1

この質問は、this one I asked earlier this weekに多少関連しています。私はまだC + +のコードを正しく反映することができないことに対処しています。今、私は何らかの形でこの機能を追加しようとしているいくつかのライブラリに出くわしていますが、もっと容易に利用できる、広く使われている(実装が簡単な)メソッドを使って、私がしなければならないことを尋ねたいと思います。反射代替としてC++デバッガを使用する

私が必要とするのは、基本的に、特定の時点におけるオブジェクトインスタンスのスナップショットです。それらはサブオブジェクト(すなわち、オブジェクトが1つ以上の他のオブジェクトを「有する」いくつかの構造)を有することができるが、基本的にそれである。現在、リフレクションは明らかな選択肢のように見えますが、プロジェクトが常にC++でコーディングされているため、これはかなり除外されています。しかし、デバッガは私が必要とするだけで(ある時点でプログラムを停止し、現在メモリにあるインスタンスについて教えて)いるように思えるので、単純なデバッグ技術を使って何らかの情報抽出を実現できるはずです。与えられたプロジェクトのコードが利用可能であると仮定することができます。私のプログラム内のワークフローは、デバッグモードで

  1. コンパイルC++コード
  2. デバッガを作成し、添付し
  3. セットブレークポイント(私は必要なすべてのインスタンスが作成されていることを示しているメソッド呼び出しを知っているように)
  4. ようになります。
  5. ランとインスタンス(サブインスタンス)をチェックし、特定のクラス(およびその継承タイプ)の、これは私は通常、基本的であるが、さらなる処理のため

この情報を抽出しますデバッグ中に他のプログラムの中から自動的にこれを行う方法に関する情報を見つけることができませんでした。これにより、ライブラリやコードの変更がなくても、限定されたリフレクションを実現できるという利点があります。ですから、JavaソリューションであるC#やC++で、VSソリューションをロードしてコンパイルしたり、メイクファイルを実行して上記の手順を実行したりする方法がありますか?私は、デバッガの使い方を教えてくれる多くのページを見つけ出していますが、実際にはここでは役に立たないのです...

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

+0

なぜあなたはリフレクションの泣き声が必要な場合は、まだC + +を使用していますか?リフレクションを提供する言語を使用してみませんか? –

+0

@Alexandre:私は大好きです。この仕事にはC++が間違った言葉であると私が思っていることを知らない同僚はいません。それでも、SystemCで書かれたシステム設計を分析することが目的です。そしてSystemCはC++ライブラリなので、これは石で設定されています。私はそれに対処する必要があります: - /。 – Jay

+0

私は、使用されているライブラリによっていくつかの内部APIをさらに使用してきました。また、MS DIA SDKを使用しています。現時点で必要な実行時情報を実際に取得できるかどうかはまだ分かりませんが、これは主にライブラリのAPIでカバーされているようです。最も重要なことに、DIA SDKは、あらゆる種類のタイプ情報(メソッド、フィールド、ベースクラスなど)へのアクセスを提供します。これは、私が探していたリフレクション機能の大きな部分です。 MSDN http://www.developerfusion.com/article/84368/debugging-with-the-dia-sdk/に加えて、ちょうどその場合の素晴らしいスタートです。 – Jay

答えて

3

Visual Studioが必須でない場合は、GDBをご覧ください。このデバッガは、プログラムによって制御することができます。実際には一部のデバッガGUIで使用されるため、手順2〜4を実行する必要があります。最初のステップでは、この文脈での明らかな選択はgccです。

1

あなたのplattformがWindowsであると思われるので、WindowsまたはWindows SDKパッケージ用のデバッグツールで使用できるwindbgおよび関連(コマンドラインのみ)デバッガを使用することが原則です。

タスク2から4は自動化された方法で簡単に実行することができますが、4(インスタンスの自動チェック)はネイティブ(C++)コードに対して自動的に行うことはできません。 .netコードで反射機構のようなものが欠けています。

このような努力が本当に価値があるかどうかはわかりません。達成しようとしているのは、アプリケーションをデバッグ/チューニングすることだけで、デバッグ/リリースコードに条件付きコンパイルを使用し、トレース目的で追加のコードを追加することができます。

0

単純にコードを.NETアプリケーションに変換して.NETリフレクションを使用できませんでしたか?

+0

申し訳ありませんが、それはいいえです-go。私が取り組んでいることは、かなり大きな既存のC++アプリケーションとの互換性があると考えられています。可能であれば、基礎となるライブラリ、プログラムのソースコード、コンパイラの変更は避けてください。 – Jay

+1

次に、コマンドラインデバッガのルートに行き、プロセスにアタッチし、必要なオブジェクトがスコープ内にある賢明な場所でブレークさせる必要があります。このコードプロジェクトの記事では、あなたが自由に使える標準デバッガの概要を知ることができます。http://www.codeproject.com/KB/debug/windbg_part1.aspx – Damon8or

0

実行しようとしているのは、プログラムの実行中の特定の時点で何が割り当てられているかを確認することです。コードプロファイラが役に立ちます。コードプロファイラは、コードが特定の時点で行っていることのスナップショットを表示できます。 Linuxでは、valgrindが一般的な選択です。私はそれを使用したことはありませんが、Visual Studioはプロファイラを持っているはずです。

関連する問題