我正在研究一个用C语言编写的程序,我偶尔使用地址清理程序构建,基本上是为了捕获错误.当程序启动时,程序会在日志中打印一个横幅,其中包括:构建它的人,构建它的分支,编译器等.我认为如果二进制文件是使用地址清理程序构建的,也会很好.我知道有__has_feature(address_sanitizer),但这只适用于clang.我尝试了以下简单程序:
#include <stdio.h>
int main()
{
#if defined(__has_feature)
# if __has_feature(address_sanitizer)
printf ("We has ASAN!\n");
# else
printf ("We have has_feature, no ASAN!\n");
# endif
#else
printf ("We got nothing!\n");
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在构建时gcc -Wall -g -fsanitize=address -o asan asan.c,这会产生:
We got nothing!
Run Code Online (Sandbox Code Playgroud)
随着clang -Wall -g -fsanitize=address -o asan asan.c我得到:
We has ASAN!
Run Code Online (Sandbox Code Playgroud)
是否有一个等同于__has_feature的gcc?
我知道有办法检查,比如使用地址清理程序构建的程序的巨大VSZ值,只是想知道是否有编译时定义或其他东西.
我最近将 Linux 开发 VM 从 Ubuntu 16.04 升级到 18.04,并注意到一件事发生了变化。这是在 x86-64 上。在 16.04 中,我一直有这样的工作流程,我将使用 gcc(5.4,16.04 中的股票版本)和-fsanitize=addressand构建我正在处理的项目-O0 -g,然后通过 gdb(7.11.1,也是Ubuntu 附带的版本)。这工作得很好,最后,如果 LeakSanitizer 检测到内存泄漏,它会生成一个泄漏报告。
在 18.04 中,这似乎不再起作用;LeakSanitizer 抱怨在 ptrace 下运行:
==5820==LeakSanitizer has encountered a fatal error.
==5820==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==5820==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)
Run Code Online (Sandbox Code Playgroud)
然后程序崩溃:
Thread 1 "spyglass" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
Run Code Online (Sandbox Code Playgroud)
我不确定是什么导致了新行为。在 18.04 上,我使用默认的 gcc (7.3.0) 进行构建,使用-fsanitize=address -O0 -g默认的 gdb (8.1.0)进行调试。可以以某种方式重新启用旧行为吗?或者我是否需要更改我的工作流程并在杀死它以获得泄漏报告之前与程序分离?
我目前正在使用autotools开发Linux项目.代码在SCM(Perforce)中提交,我们有配置脚本Makefile.am,Makefile.in - 通常的autotools样板.最近,有人改变了Makefile.am,但忘了重新生成Makefile.in; 当我尝试构建时,我收到此错误:
WARNING: `automake-1.11' is missing on your system. You should only need it if
you modified `Makefile.am', `acinclude.m4' or `configure.ac'.
You might want to install the `Automake' and `Perl' packages.
Grab them from any GNU archive site.
cd . && /bin/bash ./config.status Makefile depfiles
Run Code Online (Sandbox Code Playgroud)
我看到automake版本在configure脚本中是硬编码的(似乎来自aclocal.m4):
am__api_version='1.11'
Run Code Online (Sandbox Code Playgroud)
所以我想我需要使用automake-1.11(不是1.10,而不是更新的)来重新生成Makefile.in文件.
这是为什么?我们为什么要绑定特定的automake版本?我们主要在Ubuntu 14.04上构建,其中1.14是安装的默认版本.有没有办法告诉构建系统简单地使用任何版本的automake?或者从aclocal.m4中删除am__api_version定义是否安全?