运行守护进程时如何获取AddressSanitizer的检测输出及摘要
守护进程AddressSanitizer检测摘要无法输出的问题
我写了一段基础的守护进程代码,希望查看它的AddressSanitizer检测摘要。进程确实在main函数的strcpy(mem, sentence)处终止,但始终看不到AddressSanitizer的Summary输出。
代码实现
static void skeleton_daemon() { pid_t pid; /* Fork off the parent process */ pid = fork(); /* An error occurred */ if (pid < 0) exit(EXIT_FAILURE); /* Success: Let the parent terminate */ if (pid > 0) exit(EXIT_SUCCESS); /* On success: The child process becomes session leader */ if (setsid() < 0) exit(EXIT_FAILURE); signal(SIGCHLD, SIG_IGN); signal(SIGHUP, SIG_IGN); /* Fork off for the second time*/ pid = fork(); /* An error occurred */ if (pid < 0) exit(EXIT_FAILURE); /* Success: Let the parent terminate */ if (pid > 0) exit(EXIT_SUCCESS); /* Set new file permissions */ umask(0); chdir("/"); /* Close all open file descriptors */ int x; for (x = sysconf(_SC_OPEN_MAX); x>=0; x--) { close (x); } /* Open the log file */ openlog ("firstdaemon", LOG_PID, LOG_DAEMON); } int main() { skeleton_daemon(); while (1) { syslog (LOG_NOTICE, "First daemon started."); // 仅能看到这条日志 sleep (20); char sentence[] = "Hello, this is a sentence1."; char *mem = malloc(10 * sizeof(char)); strcpy(mem, sentence); // AddressSanitizer应该在此处输出信息 syslog (LOG_NOTICE, "Didn't hit sanitizer."); break; } syslog (LOG_NOTICE, "First daemon terminated."); closelog(); return EXIT_SUCCESS; }
编译命令
gcc12 -g3 -fsanitize=address -fsanitize=leak -static-libasan -o firstdaemon mydeamon.c
问题原因
核心问题出在skeleton_daemon()函数中关闭所有文件描述符的逻辑:它把标准输出(fd=1)、标准错误(fd=2)也一起关闭了,而AddressSanitizer的错误摘要默认是输出到标准错误的。当这两个描述符被关闭后,ASAN无法将信息输出到终端,自然看不到摘要内容。
解决方法
方法1:保留标准输出/错误描述符
修改关闭文件描述符的循环,跳过0、1、2这三个核心描述符:
/* Close all open file descriptors except stdin, stdout, stderr */ int x; for (x = sysconf(_SC_OPEN_MAX); x >= 3; x--) { close(x); }
方法2:指定ASAN日志文件路径
运行程序前设置环境变量,强制ASAN将日志写入指定文件:
ASAN_OPTIONS=log_path=/tmp/asan.log ./firstdaemon
之后查看/tmp/asan.log就能看到完整的检测摘要。
方法3:将ASAN日志输出到syslog
设置环境变量让ASAN通过syslog输出信息,这样就能和守护进程的日志一起在系统日志(如/var/log/syslog或/var/log/messages)中查看:
ASAN_OPTIONS=log_to_syslog=1 ./firstdaemon
内容的提问来源于stack exchange,提问作者Nabz C
相关产品推荐
相关产品推荐

