通常Linux中的崩溃报告可能如下所示:
[jack-VirtualBox:14564] *** Process received signal ***
[jack-VirtualBox:14564] Signal: Segmentation fault (11)
[jack-VirtualBox:14564] Signal code: (-6)
[jack-VirtualBox:14564] Failing at address: 0x3e8000038e4
[jack-VirtualBox:14564] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f1c048f0390]
[jack-VirtualBox:14564] [ 1] /lib/x86_64-linux-gnu/libpthread.so.0(raise+0x29)[0x7f1c048f0269]
[jack-VirtualBox:14564] [ 2] ../test/send_recv[0x400b6c]
[jack-VirtualBox:14564] [ 3] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f1c04535830]
[jack-VirtualBox:14564] [ 4] ../test/send_recv[0x4009d9]
[jack-VirtualBox:14564] *** End of error message ***
一个程序通过软件或硬件做一些意想不到的事情。信号被发送到该程序,(1)由信号处理程序处理的信号(2)未注册信号处理程序,默认处理程序被触发。
所以看起来所有程序的崩溃和挂起都与信号有关。有没有可能崩溃或挂起不是由信号引起的?
发布于 2018-04-20 22:18:06
好吧,这取决于你如何定义崩溃和挂起。
我会把崩溃定义为一种使你的程序停止的异常情况。挂起是一种使你的程序不能正常工作的异常情况。
例如,您可以将该代码等同于以下代码:
while (true) ;
实际上是挂起,即使在进程未完成且未引发信号的情况下也是如此。
请注意,您不需要从字面上编写无限循环。例如,代码如下:
int y = ...;
for (unsigned char x = 0; x < y; ++x)
{ /*...*/ }
如果y
恰好大于255,则将挂起。
关于崩溃,在C++中你可以这样写:
int main()
{
try
{
return real_main();
}
catch (...)
{
std::cerr << "unhandled exception" << std::endl;
return 1;
}
}
然后,任何意外的异常都将结束程序,但也不会引发任何信号。这是撞车事故吗?它看起来确实像一个……
其他示例:
void *safe_malloc(size_t sz)
{
void *m = malloc(sz);
if (m == 0)
{
fprintf(stderr, "out of memory error\n");
exit(99);
}
return m;
}
#define malloc safe_malloc
现在,malloc
故障将会崩溃,而不会发出信号。
PS:也许我应该调用abort()
而不是exit(99)
,但abort()
实际上引发了SIGABRT
,所以它会破坏我的示例。
发布于 2018-04-20 22:33:07
有些崩溃不是由信号引起的。在Linux中,当操作系统决定您的进程必须终止时,就会发生这种情况。
有人送来了SIGKILL。这不是真正的信号。操作系统以极端偏见终止您的程序。
系统内存不足,但有些东西需要更多内存。如果Linux使用了过度提交,它承诺可以提供更多的内存。所以它会杀死一些东西。这可能是你的程序。它倾向于选择最大的内存用户,所以如果你有一个内存泄漏,你可能会经常遇到这种“崩溃”。没有信号。只是死亡。
https://stackoverflow.com/questions/49938938
复制相似问题