You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Eclipse CDT中获取无限循环时的堆栈跟踪

在Eclipse CDT中获取无限循环进程的堆栈跟踪(无需崩溃或手动发SIGSEGV)

你用killall -SIGSEGV的方法虽然能拿到堆栈,但会直接终止进程,其实Eclipse CDT本身就有更优雅、规范的方式来处理这种情况,而且不会杀掉进程,方便你后续继续调试:

方法1:直接使用调试器的暂停功能

这是最简便的方式,完全不用命令行:

  • 当你的进程陷入无限循环时,切换到Eclipse的Debug视角(如果没打开,点击右上角的Debug图标或者通过Window > Perspective > Open Perspective > Debug打开)。
  • 在Debug视图里找到正在运行的目标进程,然后点击调试工具栏上的暂停按钮(图标是两个竖线⏸️,和播放按钮相邻)。
  • 点击后,调试器会立刻暂停进程的执行,这时你就能在Call Stack(调用堆栈)视图里看到当前线程的完整执行栈了,精准定位到循环所在的函数和代码行。

方法2:给进程发送非终止型信号

如果暂停按钮没反应(极少数情况),可以给进程发送SIGINT或SIGSTOP信号,这两个信号只会暂停进程,不会让它崩溃:

  • 在Eclipse的Debug视图中,右键点击目标进程,选择Signal选项。
  • 在弹出的信号列表里,选择SIGINT(和终端里按Ctrl+C效果一样)或者SIGSTOP,进程会立刻暂停,之后就能查看调用堆栈了。
  • 如果你习惯用命令行,也可以先通过ps aux | grep <process_name>找到进程PID,然后执行kill -SIGINT <pid>或kill -SIGSTOP <pid>,回到Eclipse就能看到进程已暂停,堆栈也能正常查看。

方法3:使用GDB命令手动获取堆栈

如果上述图形界面操作不方便,还可以直接在Eclipse的Debug Console里输入GDB命令:

  • 先通过暂停按钮或发送信号让进程暂停。
  • 在Debug Console里输入bt(backtrace的缩写),按回车,就能直接打印出当前线程的完整调用堆栈;如果要查看所有线程的堆栈,输入bt all即可。

为什么这些方法更规范?

你之前用SIGSEGV的方式会让进程异常终止,一旦执行就没法继续调试循环里的逻辑了。而上面的方法都是暂停进程而非终止,拿到堆栈后,你还可以继续单步执行、查看变量值,深入排查循环的触发原因,调试流程更连贯。

内容的提问来源于stack exchange,提问作者user149408

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:01:55