Solaris

Solaris pstack 如何讀取輸出/輸出格式

  • July 6, 2019

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
...

我們所涉及的應用程序函式中僅有的兩個是__select_cb()_smog_w_alarm_post_ack_actions(),其他的是 Motif GUI/Widget 庫呼叫。但是,看看我們的函式定義:

static void __select_cb( Widget w, XtPointer call_data );
void _smog_w_alarm_post_ack_actions( Widget w, Alarm_Public_Data *alarm );

每個函式只有兩個參數。我希望其中一個Widget指針不正確(可能指向一個已經關閉的視窗)。我想知道這些數字中的哪些(如果有)映射到實際參數值/地址,以幫助調試問題。

列印的函式參數pstack是“最佳猜測”,因為pstack()它不是完整的調試器,在某些情況下,即使是完整的調試器也不能保證在沒有完整調試數據的情況下準確再現函式的參數。

Solarispstack命令建立在提供程序控制和資訊功能libproc.so庫之上。請參閱Illumospstack原始碼,了解該實用程序如何使用函式pstack檢索程序呼叫堆棧。Pstack_iter()

根據註釋部分:

筆記

確定每個幀的參數的數量和值,以及所有寄存器的值,在某種程度上是啟發式的。因此,傳遞給函式的 、 和 參數中regsargc值不能保證是正確的。argv``call-back()

通常可以推斷出參數是什麼——你可以sigacthandler (b, ...在上面看到--- called from signal handler with signal 11 (SIGSEGV) ---。在這種情況下,十六進制b是十進制11- SIGSEGV

類似的值101314990可能是堆地址,類似的值ffffffff7fffe560可能是堆棧地址。您可以使用該pmap實用程序檢查程序的地址空間以驗證這些值。

如果您需要更多確定性,請使用完整的調試器並使用調試符號進行編譯。

引用自:https://unix.stackexchange.com/questions/528461