0

我正在尝试在服务器上对我怀疑与缓冲区溢出有关的问题进行一些调试,因此我尝试编译我的代码-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 中获得该系统上正确的核心文件(这就是怀疑数组溢出的原因)。

4

1 回答 1

1

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

默认情况下,较新版本的 GCC/Clang会从核心中删除阴影,以便可以执行类似的操作

export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0

但恐怕 4.8 太旧了。

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

注意:我发布了在所有平台上启用核心转储的建议。

于 2017-07-26T19:27:06.690 回答