Solaris pstack 如何读取输出/输出格式

Solaris pstack 如何读取输出/输出格式

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指针不正确(大概指向一个已经关闭的窗口)。我想知道这些数字中的哪些(如果有)映射到实际参数值/地址,以帮助调试问题。

答案1

打印的函数参数pstack是“最佳猜测”工作,因为它pstack()不是完整的调试器,在某些情况下,即使完整的调试器也无法保证在没有完整调试数据的情况下准确再现函数参数。

Solarispstack命令构建于图书馆libproc.so,提供过程控制和信息功能。看Illumospstack源代码了解该实用程序如何pstack使用以下命令检索进程调用堆栈Pstack_iter()功能

根据笔记部分:

笔记

确定每个帧的参数的数量和值以及所有寄存器的值在某种程度上是启发式的。因此,不能保证传递给函数的 、 和 参数regsargc的值是正确的。argvcall-back()

通常可以推断出参数是什么 - 您可以sigacthandler (b, ...在上面看到--- called from signal handler with signal 11 (SIGSEGV) ---。在这种情况下,十六进制b是十进制11- SIGSEGV

诸如 之类的值101314990可能是堆地址,类似于 的值ffffffff7fffe560可能是堆栈地址。您可以使用该pmap实用程序检查进程的地址空间以验证这些值。

如果您需要更多确定性,请使用完整的调试器并使用调试符号进行编译。

相关内容