【问题标题】:What does it mean when an executable stops responding to Ctrl+C?可执行文件停止响应 Ctrl+C 是什么意思?
【发布时间】:2010-11-22 02:42:37
【问题描述】:

我一直在进行一些调试,并编写了一些 C 代码,这些代码执行大量与指针相关的操作(作为 Valgrind 工具),这些操作在 Valgrind 之上运行。在过去的一个小时里,我更改了一些东西,结果程序执行得很好,但是当我尝试终止它时停止响应 Ctrl+C。

我尝试通过gdb 运行程序,但仍然观察到相同的行为。谁能告诉我是什么触发了这种行为?

更新:我认为是无限递归导致了错误,但我仍然很好奇它为什么不响应命令。

【问题讨论】:

  • 无限递归(对我而言)通常很快就会出现段错误。
  • @Chris Lutz:是的。这也是我所期待的,但它一直在继续......也许还有更多事情发生......我不明白它在哪里获得无限堆栈空间来推送函数调用......

标签: c debugging gdb valgrind


【解决方案1】:

一个非常严重挂起的程序。尝试打开另一个终端并做

kill -SIGINT `pidof program-name`

(如果-SIGINT 不起作用,请移至-SIGTERM-SIGKILL(请注意,SIGKILL 是立即终止 并带有NO 清理))

【讨论】:

  • +1 感谢您的建议。我知道如何终止程序,但很想知道是什么导致了这种情况,即进程不响应任何终止命令。基本上,我想知道更多关于Very badly hung program 部分我猜:)
  • @Legend 当程序挂起时,通常是由于某些编程错误导致无限资源使用。所以你很可能犯了一个错误。
【解决方案2】:

至于如何这可能发生,当一个希望实际处理中断时,例如,进行一些清理,它将注册自己的中断处理程序以使用而不是默认处理程序(通常只需根据具体中断调用exit()abort())。如果该中断中存在错误,则处理程序会发生,但程序实际上并没有按预期工作。由于终止程序的唯一方法是向其发送中断,因此您根本无法终止程序。

嗯,实际上,有一个中断是您无法做到的,SIGKILL。你不能在你的程序中做任何事情来阻止它被立即调用abort()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多