我试图在服务器上对我怀疑与缓冲区溢出有关的问题进行一些调试,所以我尝试使用-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在这个系统上获得适当的核心文件(这就是怀疑阵列溢出的来源)。
答案 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_syslog
或stderr
来保留它们。
注意:我posted suggestion在所有平台上启用coredump。