gcc address sanitizer 核心转储出错

gcc address sanitizer core dump on error

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

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

我在调用软件时在命令行中添加了 ASAN_OPTIONS=abort_on_error=1(使用 shell 脚本),并检查了 ulimit -c 结果是无限制的,但是它只是不会产生核心转储。

我错过了什么?

这是在 ubuntu 14.04 服务器上,gcc 版本为 4.8.4

编辑:sysctl kernel.core_pattern 回馈 kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P。这可能意味着启用了批准(至少以某种形式)。但是,我已经能够从软件中的断言和 SIGFPE 获得该系统上的正确核心文件(这就是怀疑数组溢出的来源)。

让我猜猜,这是 x64 目标吗?那里禁用了核心转储以避免转储 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 对这个来说太旧了。

作为替代建议,为什么回溯对您来说还不够?如果您无法访问程序 stderr.

,您可以使用 log_pathlog_to_syslog 来保存它们

注意:我 posted suggestion 在所有平台上启用核心转储。