堆栈跟踪正在运行的UNIX应用程序
Stack trace running UNIX application
如何在运行的UNIX应用程序上执行实时堆栈跟踪?在堆栈跟踪完成后,是否有任何实用程序可以用于消化堆栈跟踪?
我想看看是否有任何函数被调用的次数比我预期的要多-应用程序工作正常,它只是最近变慢了,并且系统中似乎没有其他任何东西负责(没有其他进程运行异常的内存/处理器使用)。
分析工具将显示程序的哪些部分占用了CPU时间。如果您必须深入研究,则可能需要其他工具。根据您所追求的unix类型,工具会有所不同,因为这有时与平台相关。本文讨论Linux上的进程监视。不同版本的unix可能有不同的实用程序集,用于必须与内核交互的函数(例如Solaris的Dtrace)。
您是否尝试过在应用程序上使用实际的分析器?这将比堆栈跟踪更有帮助。通常你只需要编译你的应用程序和配置文件信息。然后,您可以运行它并使用写入的信息来确定哪些函数花费了最多的时间,调用次数等。
如何在运行的UNIX应用程序上执行实时堆栈跟踪
gcore
可用于获取活动进程的核心文件。这将为您提供所有线程的堆栈跟踪的快照。然而,对于您的需求来说,这种方法可能有点太重量级了。
如果可疑函数是系统调用,您可以尝试使用strace
查看发生了什么。
在任何情况下,我认为第一个停靠港应该是一个分析器,如gprof
。
我猜您希望在运行时不涉及任何调试器。为此,您可以使用glibc的回溯函数。这里和这里的文档(假设是Linux)只是帮助您入门。
调试器可能具有附加到正在运行的进程的功能。对于gdb
,这看起来像
$ gdb path/to/exec 1234
其中1234为正在运行进程的PID。
(但是考虑那些引导您使用分析工具的答案)
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 如何设置Qt应用程序以使用类Unix系统的实际环境变量?
- 如何在Windows中为Unix/Linux编译C++应用程序
- 从Unix应用程序开始/停止应用程序
- 用unix信号优雅地终止Qt应用程序
- 我应该选择什么类型的Visual Studio c++项目来制作基本的unix应用程序?
- 堆栈跟踪正在运行的UNIX应用程序