为什么命令行程序会被 SIGABRT 杀死?

为什么命令行程序会被 SIGABRT 杀死?

我一直在使用命令行程序(通过包管理器安装),该程序工作正常,直到我使用 vim 在使用 vim 进行搜索和替换时无意中在程序的数据文件之一中插入了空字节(^@)(:s替换) 命令。从那时起,程序将无法运行,而是出现此错误:

/usr/include/c++/9/bits/basic_string.h:1048: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]: Assertion '__pos <= size()' failed.
Aborted (core dumped)

gnome-abrt显示错误原因是:

task killed by SIGABRT

具体来说SIGABRT 6

  • 在 Linux 中,在可执行文件读取的文本文件中插入空字节有什么作用?将空字节插入程序数据文件的方式类似于我在 git 提交消息中插入空字节并且以某种方式破坏 git。

  • 空字节是否会导致程序在读取该文本文件时崩溃,或者是否有其他原因?

答案1

手册页signal(7)说:

Signal     Value     Action   Comment
──────────────────────────────────────────────────────────────────────
SIGABRT       6       Core    Abort signal from abort(3)

abort(3)

NAME
abort - cause abnormal process termination

DESCRIPTION
The  abort()  first  unblocks the SIGABRT signal, and then raises that
signal for the calling process (as though raise(3) was called).  This
results in the abnormal termination of the process

因此,SIGABRT当程序本身决定中止时,很可能会发生死亡。它可能会对数据进行一些健全性检查,如果数据无效则中止。

assert()宏也调用abort(),并且碰巧您的错误消息有这样的位:

std::__cxx11::basic_string...: Assertion '__pos <= size()' failed.

这似乎表明无效值在 C++ 库中的某处使用,并且检查了不可能的情况,该情况由无效数据触发。

相关内容