如何在正在运行的UNIX应用程序上执行实时堆栈跟踪,是否有任何实用程序在完成后消化堆栈跟踪有用?
我想看看是否有任何函数被调用的次数比我预期的要多 - 应用程序工作正常,它最近放慢速度,并且看起来系统中的任何其他东西都不负责任(没有其他进程在运行时使用异常的内存/处理器)。
答案 0 :(得分:2)
您是否尝试在应用程序中使用实际的分析器?这将不仅仅是一个堆栈跟踪。通常,您只需使用配置文件信息编译您的应用程序。然后,您可以运行它并使用所写的信息来确定花费最多时间的功能,呼叫次数等。
答案 1 :(得分:2)
如何在正在运行的UNIX应用程序上执行实时堆栈跟踪
gcore
可用于获取实时进程的核心文件。这将为您提供所有线程的堆栈跟踪的快照。但是,这种方法可能会对您的需求有点过重。
如果可疑功能是系统调用,您可以尝试使用strace
查看正在进行的操作。
无论如何,我认为第一个调用端口应该是一个分析器,例如gprof
。
答案 2 :(得分:2)
分析工具将显示程序的哪些位占用CPU时间。如果你需要深入挖掘,你可能需要其他工具。根据您所使用的unix的种类,工具会有所不同,因为这有时非常特定于平台。 This article讨论了Linux上的进程监控。不同版本的unix可能具有不同的实用程序集,用于必须与内核交互的函数(例如,Solaris的Dtrace)。有些可以跨平台工作。
答案 3 :(得分:0)
我猜你想在运行时没有任何调试器干预。为此你可以使用glibc的回溯函数。文档here和here(假设Linux)只是为了帮助您入门。 This Linux Journal文章也可能有所帮助。
答案 4 :(得分:0)
您的调试器可能具有附加到正在运行的进程的功能。使用gdb
,这看起来像
$ gdb path/to/exec 1234
其中1234是正在运行的进程的PID。
(但请考虑那些将您引导至分析实用程序的答案。)