如何在运行时管理应用程序的调试模式?

时间:2018-02-12 14:43:58

标签: c linux architecture trace

假设我们在Linux上有应用程序,纯C.应用程序包含几个函数 - f1f2f3,它们接收一个结构。结构的一个元素是debug_mode,其值为ONOFF

当结构具有f1时,如何在f2f3printf(例如,某些debug_mode == ON)中切换调试模式?< / p>

我是否应始终使用if语句检查每个传入结构的debug_mode,还是有其他最佳做法不使用始终if语句?

例如,这些可能是电信产品中的痕迹,我们可以为指定用户收集一些跟踪数据。

2 个答案:

答案 0 :(得分:1)

您可以在运行时更改它,如下所示:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

#define FALSE 0 
#define TRUE 1

volatile sig_atomic_t GLOBAL_DEBUG = FALSE;

void sig_handler(int signo)
{
    if (signo == SIGUSR1) {
        // printf("received SIGUSR1\n");
        GLOBAL_DEBUG = TRUE;
    } else if (signo == SIGUSR2) {
        GLOBAL_DEBUG = FALSE;
        // printf("received SIGUSR2\n");
    }
}

int main (int argc, char **argv) {

    if (signal(SIGUSR1, sig_handler) == SIG_ERR)
        printf("\ncan't catch SIGUSR1\n");

    if (signal(SIGUSR2, sig_handler) == SIG_ERR)
        printf("\ncan't catch SIGUSR2\n");

    while (TRUE) {
        if (GLOBAL_DEBUG) printf ("DEBUG == TRUE\n");
        printf ("Hello world\n");
        sleep(1);
    }
}

在运行时期间切换GLOBAL_DEBUG如下:

user@host:~ $ kill -SIGUSR2 <pid of program>
user@host:~ $ kill -SIGUSR1 <pid of program>

BTW,请阅读signal-safety(7)(解释信号处理程序中应避免printf的原因)和signal(7)sig_atomic_t在C11标准中指定(请参阅n1570)。

答案 1 :(得分:1)

您可以使用信号(请参阅signal(7)&amp; signal-safety(7)),如mbieren's answer中所述。当然,您无法从信号处理程序中调用printf(或任何非异步信号安全函数),并且该标志应be declaredvolatile sig_atomic_t GLOBAL_DEBUG;

你可以设计你的程序。也许你的程序已经有一些事件循环(例如,因为它是一个GUI应用程序)。然后,您可以向您的程序添加一些RPCJSON服务(或一些HTTP,或您自己的socket(7)unix(7)协议,可能只有一些text-based)。您将找到许多库来帮助您(例如,libonion使您能够向程序添加一些HTTP服务;因此您可以通过Web服务器更改调试标志!)。

您没有充分了解您的计划以获得更准确的帮助。