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_path
或 log_to_syslog
来保存它们
注意:我 posted suggestion 在所有平台上启用核心转储。
我正尝试在服务器上调试我怀疑与缓冲区溢出有关的问题,因此我尝试使用 -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_path
或 log_to_syslog
来保存它们
注意:我 posted suggestion 在所有平台上启用核心转储。