gcc地址清理核心转储错误

时间:2017-07-24 12:40:52

标签: gcc core address-sanitizer

我试图在服务器上对我怀疑与缓冲区溢出有关的问题进行一些调试,所以我尝试使用-fsanitize=address编译我的代码以启用地址清理。

编译,生成的软件运行。但是,当地址清理程序检测到错误时,我试图获取核心转储,因为这几乎是我可以通过设置从系统中获取信息的唯一方法。

我在命令行前面使用ASAN_OPTIONS=abort_on_error=1调用该软件(使用shell脚本来执行此操作),并检查ulimit -c提供无限制的结果,但它只是赢了'产生核心转储。

我错过了什么?

这是在具有gcc版本4.8.4的ubuntu 14.04服务器上

编辑:sysctl kernel.core_pattern返回kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P。这可能意味着启用了apport(至少以某种形式)。但是,我已经能够通过软件中的断言和SIGFPE在这个系统上获得适当的核心文件(这就是怀疑阵列溢出的来源)。

1 个答案:

答案 0 :(得分:1)

让我猜一下,这是x64的目标吗?在那里禁用Coredumps以避免转储16 TB影子内存(有关详细信息,请参阅disable_coredump here的文档)。

较新版本的GCC / Clang remove shadow from core by default,以便可以执行类似

的操作
export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0

但我担心4.8太老了。

作为替代建议,为什么回溯对你来说还不够?如果您无法访问程序log_path,则可以使用log_to_syslogstderr来保留它们。

注意:我posted suggestion在所有平台上启用coredump。