pstack
コアファイルにSolaris出力があります。セグメントが発生したときに問題の関数で使用されるパラメータにログ内の数値をマップする方法を理解できません。
関数呼び出しの引数の数よりも出力に数が多いようです。パラメータ値/アドレスはどのような数値ですか?
これ手動まったく役に立ちません。
...
fffffffec993a8a8 sigacthandler (b, ffffffff7fffd5e0, ffffffff7fffd300, 14b7b0, fffffffec9a86000, b) + 5c
--- called from signal handler with signal 11 (SIGSEGV) ---
fffffffeba4422b0 XmMessageBoxGetChild (100400, 5, 5, 0, 118, fffffffeba62e000) + e4
000000010026a83c GetMessageDialog (101317440, 0, ffffffff7fffe130, 100420, 100400, 127a94) + 214
000000010026ab0c _XmtDisplayMessage (101317440, 0, 1000c9510, 1011927e5, ffffffff7fffe240, 101192780) + 278
000000010026b048 XmtDisplayInformationMsg (1000c9000, 1000c9, 100000, 2, 0, ffffffff7fffe2f8) + 44
00000001001573ec _smog_w_alarm_post_ack_actions (101314990, 101192760, 1003a0, 1009f4970, 101317440, 100000) + 100
000000010015819c __select_cb (101314990, ffffffff7fffe560, 101317440, 10113bfc0, 1000916d0, 10120c9d0) + 1b4
0000000100257a04 XmtCallCallback (101314990, 100257, ffffffff7fffe560, 101183530, 0, 0) + 3c4
...
私たちが扱った唯一の2つのアプリケーション機能は、そして__select_cb()
残り_smog_w_alarm_post_ack_actions()
はMotif GUI /ウィジェットライブラリ呼び出しでした。しかし、関数定義を見てください。
static void __select_cb( Widget w, XtPointer call_data );
void _smog_w_alarm_post_ack_actions( Widget w, Alarm_Public_Data *alarm );
各関数には2つのパラメータしかありません。Widget
ポインタの1つが間違っていると予想しました(おそらく閉じたウィンドウを指します。)問題をデバッグするのに役立つように、これらの数値のどれが実際のパラメータ値/アドレスにマップされているかを知りたいです。
答え1
印刷された関数引数は完全なデバッガではないpstack
ため、「最適な推測」操作であり、pstack()
場合によっては、完全なデバッガであっても、完全なデバッグデータがなければ、関数引数の正確な再現を保証することはできません。
Solarispstack
コマンドは、以下に基づいています。libproc.so
図書館、プロセス制御と情報機能を提供します。バラよりイルモスpstack
ソースコードユーティリティが次をpstack
使用してプロセス呼び出しスタックを取得する方法を学びます。Pstack_iter()
機能。
~によるとノート部分:
ノート
各フレームのパラメータの数と値、およびすべてのレジスタの値を決定するのはかなり経験的です。したがって、関数に渡されたパラメータ
regs
の値がargc
正確であるという保証はありません。argv
call-back()
通常、パラメータが何であるかを推論することが可能です。sigacthandler (b, ...
上から見ることができます--- called from signal handler with signal 11 (SIGSEGV) ---
。この場合、16進数b
は10進数11
ですSIGSEGV
。
のような値は101314990
ヒープアドレスであり、同様の値はffffffff7fffe560
スタックアドレスです。このユーティリティを使用すると、pmap
プロセスのアドレス空間を調べてこれらの値を確認できます。
より確実性が必要な場合は、デバッガ全体を使用し、デバッグシンボルを使用してコンパイルしてください。