You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行守护进程时如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:07:05