0

symgetlinefromaddr64 を使用して、stackwalk で収集したアドレスの行番号を取得しようとしていますが、単純なコマンドまたはその行のアドレスを取得できないようです。
たとえば、メソッドを見ている場合:

void Test(int g)
{
  g++;
  DoSomething(g);
  g--;
}

「DoSomething」の行番号だけを取得しますが、「g++」などの行番号が必要です。デバッガーが行うため、実行可能であると思います。WindowsのC ++で自分で行うにはどうすればよいですか?

4

2 に答える 2

0

*.pdbこれを行う唯一の方法は、Microsoft Visual Studioコンパイラ用のファイル(pdbはプログラムデータベースの略)のようなコンパイラ生成のシンボルファイルを使用することです。これらのファイルには、コンパイル手順で使用されるすべてのシンボルが含まれています。リリースコンパイルの場合でも、使用中のシンボルに関する情報を取得できます(一部は最適化されていない可能性があります)。

主な欠点は、これがコンパイラに大きく依存する/固有であるということです。たとえば、gccは、実行可能ファイルまたは実行可能ファイルにシンボル情報を含めることができます。他のコンパイラには他の形式があります...

どのコンパイラを使用していますか(名前/バージョン)?

于 2011-02-06T07:07:11.193 に答える
0

スタック ウォークは、スタックに格納されているアドレスのみを取得します。これは、関数呼び出しを意味します。g++またはのアドレスがg--必要な場合は、スタック ウォーク以外のものを使用して取得する必要があります (例: SymGetFileLineOffsets64)。スタックウォークから開始し、 からの情報を持っている場合はSymGetLineFromAddr64、 と を使用SymGetLineNext64SymGetLinePrev64て周囲の行に関する情報を取得できます。

于 2011-02-06T06:39:49.350 に答える