各メモリ割り当てのバックトレースを格納するコードを書いています。次に、これらのリストをオフライン分析用のファイルに書き込みます。win32 では_AddressOfReturnAddress
、バックトレースを使用して手動で作成します。アドレスは実行ごとにランダムであるため、 を使用GetModuleInformation
しlpBaseOfDll
てベースアドレスを取得します。これは、FPO を使用しない x86 でうまく機能します。これで十分です。次に、win32 API を使用して PDB をロードし、アドレスを関数名に変換します。
Linuxでこれを行うにはどうすればよいですか?私の現在のアプローチは__builtin_return_address(x)
、addr2line
オフラインで同じ結果を得るために使用することです。問題は、アドレスが実行ごとにランダム化されるため、アドレスをaddr2line
理解できないことです。__executable_start
実行するたびに同じ値を返すため、機能しませんでした。実行時に実行可能ファイルのベース アドレスを取得する方法はありますか?
1回実行すると、次のようになります。
__executable_start: 0x8048000
backtrace:
0x9cce628
0x9cce2b8
0x9cce260
0x9cce1f8
0x9cce138
0x9cce0c8
0x9cce060
0x9cce008
そして次:
__executable_start: 0x8048000
backtrace:
0x8db6628
0x8db62b8
0x8db6260
0x8db61f8
0x8db6138
0x8db60c8
0x8db6060
0x8db6008
等々。