代码之家  ›  专栏  ›  技术社区  ›  user149408

使用EclipseCDT在无限循环期间获取堆栈跟踪

  •  1
  • user149408  · 技术社区  · 8 年前

    我正在开发一个使用EclipseCDT的项目,遇到了一个似乎是无限循环的项目。

    在Eclipse中调试应用程序时,当进程异常终止(SegFault是最常见的)或遇到断点时,我可以轻松地检索和检查调用堆栈。

    如果我在不知道哪些语句是循环的情况下遇到一个无限循环,那么堆栈跟踪将给我一个要查看的函数的大致概念。我怎样才能告诉Eclipse让我获得一个关于进程当前正在做的任何事情的堆栈跟踪(在没有断点或segfault的情况下)?

    到目前为止我的工作是

    killall -SIGSEGV $process_name
    

    (更换 $process_name 使用您尝试调试的进程的名称)。这将导致进程的行为就好像它出现了segfaulted,也就是说,停止它并为您提供该进程当时正在执行的任何操作的调用堆栈。

    是否有一种更清洁的方法来实现这一点?

    1 回复  |  直到 8 年前
        1
  •  0
  •   user149408    8 年前

    稍微干净一点的方法是:

    killall -SIGCONT $process_name
    

    这会发送一个 CONT (继续)向进程发送信号。此信号的主要目的是在发送后继续一个进程 STOP 信号。当发送到未停止的进程时,它什么也不做。

    但是,如果在Eclipse中调试该进程(Eclipse反过来依赖于gdb进行调试),这将停止执行并导致显示堆栈跟踪。

    与…不同 -SIGSEGV (或其他指示进程丢弃其核心或终止的信号),然后您可以单击“恢复”按钮并继续运行进程。除了Eclipse将报告暂停执行的不同原因之外,UX接近于在命中断点后会发生的情况。

    请注意,如果您所做的任何事情干扰了您的进程的信号处理,那么这可能无法按预期工作。

    不过,不知道是否有任何东西可以从EclipseUI触发。