【问题标题】:Stack trace running UNIX application运行 UNIX 应用程序的堆栈跟踪
【发布时间】:2011-08-01 15:34:17
【问题描述】:

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

我正在查看是否有任何函数比我预期的更频繁地被调用 - 应用程序运行良好,只是最近变慢了,而且似乎系统中的其他任何东西都没有责任(没有其他进程以异常的内存/处理器使用率运行)。

【问题讨论】:

  • 这可能有点特定于平台,你能说你使用的是什么平台吗?

标签: c++ c unix stack-trace


【解决方案1】:

分析工具将显示程序的哪些位占用了 CPU 时间。如果您必须深入挖掘,您可能需要其他工具。根据您所追求的 unix 种类,工具会有所不同,因为这有时是特定于平台的。 This article 讨论 Linux 上的进程监控。不同版本的 unix 可能具有不同的实用程序集,用于必须与内核交互的功能(例如,Dtrace 用于 Solaris)。有些确实可以跨平台工作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢大家,这就是我一直在寻找的东西——尽管重新编译并不能解决实时运行问题。我至少可以在另一个系统上重新编译并使用配置文件信息运行另一个系统,这是一个好的开始。
    【解决方案3】:

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

    gcore 可用于获取实时进程的核心文件。这将为您提供所有线程的堆栈跟踪的快照。但是,对于您的需求,这种方法可能有点过于繁重。

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

    无论如何,我认为第一个调用端口应该是分析器,例如gprof

    【讨论】:

      【解决方案4】:

      我猜你想在运行时不需要任何调试器参与。为此,您可以使用 glibc 的回溯功能。文档herehere(假设是Linux)只是为了帮助您入门。 This Linux Journal 文章也可能有帮助。

      【讨论】:

        【解决方案5】:

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

        $ gdb path/to/exec 1234
        

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

        (但请考虑那些将您引导至分析实用程序的答案。)

        【讨论】:

          猜你喜欢
          • 2014-10-10
          • 2010-09-13
          • 2011-09-06
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多