C++应用程序以143退出代码终止。这意味着什么?

23
我的C++应用程序会定期崩溃。它会在终端中写出终止并停止运行。我不知道原因是什么(GDB不是解决方案;它是一个多线程应用程序,错误出现在大量线程上,只是GDB无法处理它们,因为性能低下)。
CentOS Linux上,退出代码143代表什么?它是否包含有关崩溃原因的信息?

1
为什么gdb不能帮忙呢?它会在崩溃发生时停止,无论崩溃发生在哪个线程。 - Some programmer dude
1
如果是Linux内核杀死了它,内核日志(使用dmesg命令)可能会有一些信息。 - jotik
你也可以使用例如 Valgrind 来查找可能导致崩溃的指针问题。如果你有太多线程,gdb 无法复制,你可能需要尝试减少线程数量以帮助找到崩溃(此外,拥有许多线程并不总是一个好主意)。 - Some programmer dude
为了处理您的应用程序的优雅关闭,您需要捕获 SIGTERM 信号并触发正确的关闭序列。 - Bodo Hugo Barwich
显示剩余2条评论
4个回答

42

143通常意味着应用程序捕获了SIGTERM信号,表示该进程已被杀死。这可能是因为另一个进程将其杀死,或者操作系统由于使用过多内存或其他资源等原因而将其杀死。没有更多信息,很难知道具体原因。


26

有一些退出码已经有了定义或者普遍认可的意义。

对于143,它是128 + 15的结果,这意味着程序因为信号15,即SIGTERM而死亡。

根据上表,退出码1-2、126-165和255具有特殊含义,所以应该避免使用它们作为用户指定的退出参数。

请参考http://www.tldp.org/LDP/abs/html/exitcodes.html上的表格。


4
一个形式为128+KillingSignal的伪装退出码意味着程序被某个KillingSignal杀死。 杀死信号#15是SIGTERM(尝试使用kill -l 15kill -l $((143-128))甚至kill -l 143(kill命令知道这种shell约定)来获取信号的书面描述(在这种情况下是TERM)。SIGTERM是如果没有指定其他信号,则由kill实用程序发送的默认信号。它是一个基本的终止请求。

很可能是某个用户或某个应用程序将其杀死(SIGTERM是可捕获的信号——如果内核要杀死(内存不足或安全违规),它不会那么温和,而是发送始终无法捕获的SIGKILL或特殊的无法捕获的SIGSYS)。更不太可能的是,程序自己使用SIGTERM退出,而非常非常不太可能的是,违反惯例,程序以实际值143退出。


-1
错误代码143意味着应用程序被其他应用程序或操作系统强制关闭。这个错误的原因有很多,如执行某些未经授权的操作,例如利用用户权限,或者系统无法提供所需的驱动器或目录,或者DNS配置存在问题,或者在罕见情况下浮点结果不准确...但是如果没有足够的信息,很难确定确切的原因...

正如其他人已经解释的那样,这意味着应用程序已经收到了一个“关闭信号”。这并不表示任何错误。这是通过操作系统或父进程终止进程的正常过程。 - Bodo Hugo Barwich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接