所以我们在 Solaris 上有一个程序,它的堆栈空间不足。
在对此进行调查时,我简要了解了堆栈的 ulimit 是什么:
user@solaris-box:~$ ulimit -a
...
stack size (kbytes, -s) 8192
所以堆栈大小限制为 8 兆字节。但这是整个过程的极限吗?
如果我的进程有 10 个线程怎么办,每个线程只允许 819k 吗?(或它们的一些混合,高达 8MiB?)
我找不到任何关于此的文档。
所以我们在 Solaris 上有一个程序,它的堆栈空间不足。
在对此进行调查时,我简要了解了堆栈的 ulimit 是什么:
user@solaris-box:~$ ulimit -a
...
stack size (kbytes, -s) 8192
所以堆栈大小限制为 8 兆字节。但这是整个过程的极限吗?
如果我的进程有 10 个线程怎么办,每个线程只允许 819k 吗?(或它们的一些混合,高达 8MiB?)
我找不到任何关于此的文档。
我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
指针不正确(可能指向一个已经关闭的窗口)。我想知道这些数字中的哪些(如果有)映射到实际参数值/地址,以帮助调试问题。