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)处理的信号没有信号处理程序注册,默认处理程序被触发。
所以看起来程序的所有崩溃和挂起都与信号有关。碰撞或挂起是否有可能不是由信号引起的?
答案 0 :(得分:0)
嗯,这取决于你如何定义崩溃和挂起。
我会将 crash 定义为导致程序停止的异常情况。 hang 是一种异常情况,会导致您的程序无法正常工作。
例如,您可以考虑与此相当的代码:
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
,所以这会打破我的榜样。
答案 1 :(得分:0)
有些崩溃不是由信号引起的。在Linux中,当操作系统决定您的进程必须死亡时,就会发生这种情况。
kill -9 [pid]
有人派了SIGKILL。这不是一个真实的信号。操作系统只是在极端偏见的情况下终止你的程序。
OOM(内存不足)
系统内存不足,但需要更多。如果Linux使用过度提交,它承诺可以提供更多的内存。所以它杀了一些东西。这可能是你的计划。它倾向于选择最大的内存用户,所以如果你有内存泄漏,你可能会得到这个&#34;崩溃&#34;经常。没有信号。只是死亡。