堆栈跟踪正在运行的UNIX应用程序

Stack trace running UNIX application

本文关键字:UNIX 应用程序 运行 跟踪 堆栈      更新时间:2023-10-16

如何在运行的UNIX应用程序上执行实时堆栈跟踪?在堆栈跟踪完成后,是否有任何实用程序可以用于消化堆栈跟踪?

我想看看是否有任何函数被调用的次数比我预期的要多-应用程序工作正常,它只是最近变慢了,并且系统中似乎没有其他任何东西负责(没有其他进程运行异常的内存/处理器使用)。

分析工具将显示程序的哪些部分占用了CPU时间。如果您必须深入研究,则可能需要其他工具。根据您所追求的unix类型,工具会有所不同,因为这有时与平台相关。本文讨论Linux上的进程监视。不同版本的unix可能有不同的实用程序集,用于必须与内核交互的函数(例如Solaris的Dtrace)。

您是否尝试过在应用程序上使用实际的分析器?这将比堆栈跟踪更有帮助。通常你只需要编译你的应用程序和配置文件信息。然后,您可以运行它并使用写入的信息来确定哪些函数花费了最多的时间,调用次数等。

如何在运行的UNIX应用程序上执行实时堆栈跟踪

gcore可用于获取活动进程的核心文件。这将为您提供所有线程的堆栈跟踪的快照。然而,对于您的需求来说,这种方法可能有点太重量级了。

如果可疑函数是系统调用,您可以尝试使用strace查看发生了什么。

在任何情况下,我认为第一个停靠港应该是一个分析器,如gprof

我猜您希望在运行时不涉及任何调试器。为此,您可以使用glibc的回溯函数。这里和这里的文档(假设是Linux)只是帮助您入门。

调试器可能具有附加到正在运行的进程的功能。对于gdb,这看起来像

$ gdb path/to/exec 1234

其中1234为正在运行进程的PID。

(但是考虑那些引导您使用分析工具的答案)