7

次の問題があります: backtrace(3) 関数を使用して C でバックトレースを取得すると、関数の名前が返されたシンボルは、dwarf ライブラリと dladdr(3) で簡単に判別できます。

問題は、単純な関数ポインターがある場合 (たとえば&functionを渡すことによって)、dladdr + dwarf 関数が役に立たないことです。ポインターが backtrace(3) によって返されるものとは異なるようです (backtrace はこれらの関数ポインターをスタックから直接取得するため、おかしなことではありません)。

私の質問は、これらの名前も解決する方法があるかどうかです。また、2つのポインターの違いを正確に知りたいです。

ありがとう!

アップデート:

ポインター間の違いは非常に重要です:
バックトレースで得られるものは: 0x8048ca4
ダイレクト ポインター バージョン: 0x3ba838

2番目のものにはオフセットが必要なようです。

4

2 に答える 2

1

引用した典型的なアドレスの実質的な違いから推測すると、1 つは実際の共有ライブラリからのもので、もう 1 つはメインの実行可能ファイルからのものです。のマニュアル ページdladdr(3)の行間を読むと、それまでにロードされたモジュールにシンボルが配置されていdlopen(3)ない場合、一致するファイル名とシンボル名を再構築できない可能性があります。

ここで気になるモジュールからシンボルを取り除いていないか、すべての賭けがオフになっていると思います。実行可能ファイルにシンボルが含まれている場合は、名前を付けられる関数のアドレスと完全に一致するものを探すことができるはずです。結局のところ、関数へのポインタはまさにそれです。

于 2010-08-27T21:54:30.730 に答える
0

addr2line(1) はまさにあなたが探しているものかもしれません。

于 2010-08-27T21:10:53.320 に答える