2

GDB を使用してライブ python プロセスを見ていると、次のフレームが表示されます。

...
#5  call_function (oparg=<optimized out>, pp_stack=0x7fffb1b2ffa0) at Python/ceval.c:4084
#6  PyEval_EvalFrameEx (f=f@entry=0x1a03850, throwflag=throwflag@entry=0) at Python/ceval.c:2679
...

私はcall_functionどこから来たのか混乱しています。Python実行可能ファイルまたはバイナリのシンボルではないようです:

~  ᐅ objdump -x /usr/lib/libpython3.3m.so.1.0 | grep call_function
000000000005f0e0 l     F .text  0000000000000094              call_function_tail

それが既知のシンボルでない場合、GDB はそれをどのように認識するのでしょうか...そしてそれは正確には何ですか (もちろん、通常の関数であることは別として)?

4

1 に答える 1

1

これは Python インタープリターのソースにあります。gdb にはその場所が示されていますが、ここで確認できますが、別の行: 3971 にあります。

関数の定義は次のとおりです。

static PyObject * call_function(PyObject ***pp_stack, int oparg);

これはstatic関数であるため、内部リンケージがあるため、動的ライブラリ (.so ファイル) の外側は言うまでもなく、コンパイル単位の外側には表示されません。

デバッガーは、実行中のコードのデバッグ情報に何らかの方法でアクセスできるため、それを認識しています。

于 2013-09-29T21:37:45.303 に答える