如何编写 dtrace 脚本来转储 Solaris 10 上崩溃进程的堆栈?

Posted

技术标签:

【中文标题】如何编写 dtrace 脚本来转储 Solaris 10 上崩溃进程的堆栈?【英文标题】:How can I write a dtrace script to dump the stack of a crashing process on Solaris 10? 【发布时间】:2013-06-14 16:35:59 【问题描述】:

我有一个在 Solaris 10 上运行的进程,由于 SIGSEGV 而终止。由于各种无趣的原因,我不可能通过通常的方式获得回溯(gdb、回溯调用、corefile 都出来了)。但我认为 dtrace 可能有用。

如果是这样,我想编写一个 dtrace 脚本,该脚本将在进程被终止时打印进程的线程堆栈。我对 dtrace 不是很熟悉,但是对于知道它的人来说,这似乎很容易。我希望能够以监视特定进程的方式运行它。有什么想法吗?

【问题讨论】:

【参考方案1】:

以防其他人偶然发现这一点,我正在使用我拼凑的以下脚本在 OS X 上进行试验:

#!/usr/sbin/dtrace -s

proc:::fault
/pid == $1/

        ustack();

当我有一个完整的解决方案时,我会更新它。

【讨论】:

adb(实际上是 mdb)将分析核心转储的堆栈。 正如我提到的,我没有核心文件。 好的,这几乎有效,但它有时只是象征堆栈跟踪,这是必要的。似乎由于段错误导致的进程终止正在与 ustack 竞争,如此处所述:docs.oracle.com/cd/E19253-01/817-6223/chp-user/index.html。但是,我无法提出任何建议的解决方法。有什么想法吗? 另外,仅供参考,我正在 OS X 上进行测试,但我最终需要运行它的客户系统是 Solaris 10。 您的标签有一个用于 Solaris 的标签:在 Solaris 中,您使用 gcore 在实时进程上强制进行核心转储,这会创建一个核心文件。然后使用 mdb。 Dtrace 是一个很棒的工具,如果你打算广泛使用它,那太好了,花很多时间开发一些东西,这样你就可以学习了。它确实有一个陡峭的学习曲线:我的 DTRACE (Gregg & Mauro) 书有 1100 多页。在关闭/开启使用的 2 年中,我还没有学到一半。【参考方案2】:

几个 Solaris 工程师编写了一个使用 Dtrace 捕获崩溃数据的脚本,并发表了一篇关于使用它的文章,现在可以在 Oracle Technology Network: Enabling User-Controlled Collection of Application Crash Data With DTrace 找到。

其中一位作者还发布了他的博客的一些更新,仍然可以在https://blogs.oracle.com/gregns/ 阅读,但自从他 2007 年去世以来,没有任何进一步的更新。

【讨论】:

以上是关于如何编写 dtrace 脚本来转储 Solaris 10 上崩溃进程的堆栈?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Dtrace 在 Solaris 10 上检查 malloc?

从 DTrace 脚本调用 C 函数

如何用 D 语言正确打印 uint64_t (dtrace)

Oracle Solaris 上的 dtrace java API?

FreeBSD 用户空间 DTrace 和用户空间的转储函数参数

如何使用 dtrace 显示每个进程消耗的微秒 cpu?