在Fedora 22虚拟机上,我的C程序崩溃了SIGABRT。 GDB指向glibc存根中用于轮询系统调用的指令。反汇编看起来像这样:
0x7f5359c46662 <poll+34> mov %rax,(%rsp)
0x7f5359c46666 <poll+38> mov $0x7,%eax
0x7f5359c4666b <poll+43> syscall
>0x7f5359c4666d <poll+45> mov (%rsp),%rdi
0x7f5359c46671 <poll+49> mov %rax,%rdx
0x7f5359c46674 <poll+52> callq 0x7f5359c5fa30 <__libc_disable_asynccancel>
(存根的源代码是汇编代码,需要进行复杂的宏处理,所以这里不值得引用。)
我不知道SIGABRT的来源。
民意调查系统调用联机帮助页并不能说它可以提出SIGABRT。
还有另一个线程,但它正在等待读取系统调用,所以我不知道它是如何向崩溃线程发送信号的。
我不知道系统中可能会杀死SIGABRT&#34;这个过程。
使用-D_FORTIFY_SOURCE = 2编译代码,这可能导致SIGABRT,但我希望它是同步的,这样gdb就会指向引发它的代码。
答案 0 :(得分:0)
两个潜在来源:
systemd在监视程序计时器到期时发送SIGABRT,例如: https://lists.libreswan.org/pipermail/swan-dev/2016-July/001577.html
内核可以在遇到恐慌时SIGABRT userland,例如: https://github.com/systemd/systemd/issues/917