精华内容
下载资源
问答
  • 先看代码   time_t tt = time(NULL); time_t jsdtime= time(NULL); time_t jgtime = 20; jsdtime += jgtime; printf("当前时间 = %d 结束时间 = %d \n", tt, jsdtime);...我们再换一...

    先看代码  

     time_t tt = time(NULL);
     time_t jsdtime= time(NULL);
     time_t  jgtime = 20;
     jsdtime += jgtime;
     printf("当前时间 = %d 结束时间 = %d \n", tt, jsdtime);

    这里输出的结果如下:

    可以看到打印的第二个参数jsdtime 输出的是0

    我们再换一种写法:

    	time_t tt = time(NULL);
    	time_t jsdtime= time(NULL);
    	time_t  jgtime = 20;
    	jsdtime += jgtime;
    	printf("当前时间 = %d \n", tt);
    	printf("结束时间 = %d\n", jsdtime);

    输出结果:

    这次2个参数的输出都正确了。

    于是作为一个喜欢刨根问底的人我就想查下根本原因

    乱七八糟查了一堆资料也没头绪,偶然的一个原因我看了一个警告:

    我们知道printf这个方法在处理占位符时可以自动把参数类型转换成字符类型来处理。

    比如:

    int a = 10;
    
    float b = 0.332f;
    
    print("a=%d b=%e",a,b);

    print 打印时会根据占位符来自动处理数据类型转成字符输出

    经过多次测试。第一次的警告print可以正常转换,之后的所有有警告的数据类型不符的都不会正确处理

    展开全文
  • C语言写入日志功能

    2020-12-02 15:26:45
    自己写的 日志函数 编译调试通过 使用方法 my_printf(“send mqtt pag ok”); void my_printf(const char *str)//日志函数 { struct timeval tv; gettimeofday(&tv,NULL);//获取1970-1-1到现在的时间结果保存到...

    自己写的 日志函数 编译调试通过
    使用方法 my_printf(“send mqtt pag ok”);
    void my_printf(const char *str)//日志函数
    {
    struct timeval tv;
    gettimeofday(&tv,NULL);//获取1970-1-1到现在的时间结果保存到tv中
    uint64_t sec=tv.tv_sec;
    uint64_t min=tv.tv_sec/60;

    struct tm cur_tm;//保存转换后的时间结果
    localtime_r((time_t*)&sec,&cur_tm);
    char cur_time[20];
    snprintf(cur_time,30," time=%d-%02d-%02d %02d:%02d:%02d\n",cur_tm.tm_year+1900,cur_tm.tm_mon+1,cur_tm.tm_mday,cur_tm.tm_hour,cur_tm.tm_min,cur_tm.tm_sec);
    
    FILE * fd;
    fd=fopen("/home/log.txt","a+");
    unsigned char * buf[100]={0};
    memcpy(buf,str,strlen(str));
    fwrite(buf,1,strlen(str),fd);
    fwrite(cur_time,1,34,fd);
    fclose(fd);
    

    }

    展开全文
  • C语言调试的几种方法

    2015-05-31 18:33:00
    linux系统下,在不gdb调试的情况下,我们如何解决程序崩溃问题呢?首先想到的就是添加log日志信息,其次还有以下几种方法可以帮助我们分析存在的问题: (一)add2line 程序崩溃时会打出一些崩溃地方的地址空间,...

    linux系统下,在不gdb调试的情况下,我们如何解决程序崩溃问题呢?首先想到的就是添加log日志信息,其次还有以下几种方法可以帮助我们分析存在的问题:

    (一)add2line

      程序崩溃时会打出一些崩溃地方的地址空间,可以使用此方法显示崩溃地方对应的函数或者某一行,使用方法如下:

      echo "0x63d8a9" | addr2line -e bin/httpd -f  : 崩溃查对应代码行

    (二)把出错时的堆栈信息打印出来,类似gdb调试中bt功能。

    #define BACKTRACE() \
        do {    \
            void*   array[20];  \
            size_t  size;       \
            char**  strings;    \
            size_t  i;          \
            size = backtrace(array, 20); \
            strings = backtrace_symbols(array, size); \
            for (i=0; i< size; i++) { \
                printf("%s\n", strings[i]); \
            } \
            free(strings);      \
        } while(0)
    
    static void signal_handler(int sig)
    {
        switch(sig)
        {
            case SIGSEGV: /* segmentation fault */
            case SIGFPE:  /* erroneous arithmetic operation */
            case SIGBUS:  /* bus error */
                BACKTRACE();
                exit(EXIT_FAILURE);
                break;
            default:
                break;
        }
    }
    
    int main()
    {
        signal(SIGSEGV, signal_handler);
        signal(SIGFPE,  signal_handler);
        signal(SIGBUS,  signal_handler);
    }

     

        

     

    参考:

    1、http://www.justcodeit.info/

    转载于:https://www.cnblogs.com/tibetanmastiff/p/3090384.html

    展开全文
  • 日志在大型应用程序中对于定位程序的运行状况和调试问题中显得很重要,一个可靠的日志分级系统可以帮助开发人员快速定位问题所在。
  • 起语: 版权声明 C语言技术网原创文章,转载请说明文章的来源、作者...C语言gdb调试之精髓 (程序日志) 设置断点或单步跟踪可能会严重干扰多进(线)程之间的竞争状态。导 致我们看到的是 个假象。 一旦我们在某一个线程

    起语:

    版权声明
    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

    来源:C语言技术网(www.freecplus.net)

    作者:码农有道

    如果文章有错别字,或者内容有错误,或其他的建议和意见,请您联系我们指正,非常感谢!!!


    我只是用来方便学习 && 复习!!! 我只是一个学习者, 内功有限, 大家看到谨慎参考!!!
    在这里插入图片描述

    C语言gdb调试之精髓 (程序日志)

    设置断点或单步跟踪可能会严重干扰多进(线)程之间的竞争状态。导
    致我们看到的是
    个假象。

    一旦我们在某一个线程设置了断点,该线程在断点处停住了,只剩下另
    个线程在跑。这时候,并发的场景已经完全被破坏了,通过调试器看到
    的只是一个和谐的场景 (理想状态)。

    调试者的调试行为干扰了程序的运行,导致看到的是一个干扰后的现象。
    既然断点和单步不一定好用,咋整捏?
    老办法,输出log日志,它可以避免断点和单步所导致的副作用。

    测试代码:

    在这里插入图片描述
    gdbfork.cpp

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main()
    {
        printf("begin \n");
    
        if (fork() != 0) //pid_t fork(void);
        {
            //我是父进程: pid=1322, ppid=1134
            printf("我是父进程: pid=%d, ppid=%d\n", getpid(), getppid()); //get process identification
            //getppid()返回调用进程父进程的进程ID
            //getpid()返回调用进程的进程ID。(这通常被用于生成唯一的临时文件名的例程。)
    
            int ii;
            for (ii = 0; ii < 10; ii++)
            {
                printf("ii=%d\n", ii);
                sleep(1);
            }
    
            exit(0);
        }
        else
        {
            //我是子进程: pid=1323, ppid=1322
            printf("我是子进程: pid=%d, ppid=%d\n", getpid(), getppid());
    
            int jj;
            for (jj = 0; jj < 10; jj++)
            {
                printf("jj=%d\n", jj);
                sleep(1);
            }
    
            exit(0);
        }
        
        return 0;
    }
    
    
    

    运行结果:
    在这里插入图片描述
    缺点, 在什么时间产生什么日志, 没有记录, 这样子不行.
    在这里插入图片描述
    这个是老师写的框架
    这个网站, 有详细的文档, 可以参考使用

    修改使用老师的freecplus框架(需要的文件)
    在这里插入图片描述

    代码如下:
    在这里插入图片描述
    gdbfork.cpp

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include "_freecplus.h"
    
    int main()
    {
        CLogFile logfile;
    
        logfile.Open("/home/weifc/share/Linux_gdb调试/gdbfork.log", "w+");
    
        logfile.Write("begin\n");
    
        if (fork() != 0) //pid_t fork(void);
        {
            //我是父进程: pid=1322, ppid=1134
            logfile.Write("我是父进程: pid=%d, ppid=%d\n", getpid(), getppid()); //get process identification
            //getppid()返回调用进程父进程的进程ID
            //getpid()返回调用进程的进程ID。(这通常被用于生成唯一的临时文件名的例程。)
    
            int ii;
            for (ii = 0; ii < 10; ii++)
            {
                logfile.Write("ii=%d\n", ii);
                sleep(1);
            }
    
            exit(0);
        }
        else
        {
            //我是子进程: pid=1323, ppid=1322
            logfile.Write("我是子进程: pid=%d, ppid=%d\n", getpid(), getppid());
    
            int jj;
            for (jj = 0; jj < 10; jj++)
            {
                logfile.Write("jj=%d\n", jj);
                sleep(1);
            }
    
            exit(0);
        }
        
        return 0;
    }
    

    运行结果:

    日志打印的位置
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    查看里面的内容

    这里就可以跟踪时间执行的效果

    多线程也一样!

    视频来源:
    在这里插入图片描述

    结语:

    在这里插入图片描述
    时间: 2020-09-04

    展开全文
  • c语言 DEBUG 日志打印

    千次阅读 2015-07-09 14:11:07
    //显示调试信息 #define Log(format,...) printf(format,## __VA_ARGS__); #else //不显示调试信息 #define Log(format,...) #endif void doSomething(){  //DEBUG1 == 1 显示调试信息  
  • Linux系统下学习C语言利用vscode编写程序Example 利用vscode编写程序 为了学习Linux系统,只用vscode写代码,编译和调试运行都在终端进行,也就是无需进行诸多教程中编辑task.json和launch.json那一步,后续还需学习...
  • c语言日志框架,可以用来记录调试记录 显示时间跟运行的文件及所在行数,定位起来非常方便。
  • C语言日志模块的使用

    千次阅读 2019-01-06 22:41:41
    在产品研发的过程中,经常需要借助打印信息来帮助调试和后期维护。所以拥有一个完善的日志模块是至关重要的。 如下是从经手的项目中整理出来的日志模块及使用示例,以备后续项目开发时使用。 log.c #include &...
  • /* 取消其它文件的__DEBUG宏定义,避免文件之间的调试功能相互干扰 */ #undef __DEBUG /* 调试开关,定义__DEBUG表示打开该文件的调试功能 */ #define __DEBUG #ifdef __DEBUG #define DEBUG(fmt, args...) ...
  • 1自定义日志调试 1-1引入 #include <stdio.h> int fact(int n){ int i,f=1; for( i=1; i<=n; i++){ f += i; } return f; } int main(){ printf( "4!=%d\n", fact(4) ); return 0; } 输出结果为:4!...
  • C语言gdb调试之精髓(常用命令、多进程、多线程、程序日志) 起语: 版权声明: C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。 来源:C语言技术网(www.freecplus.net) 作者:码农有道 如果文章有...
  • C语言gdb调试之精髓(常用命令、多进程、多线程、程序日志) 起语: 版权声明: C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。 来源:C语言技术网(www.freecplus.net) 作者:码农有道 如果文章有...
  • ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------- ...//显示调试信息 #define Log(format,...) printf(format,## __VA_ARGS__); #else //不显示调试信息 #define Log(format
  • 一个简单的用于嵌入式Linux开发的C调试日志打印接口简介这个C语言调试日志接口的目的是提供一种用于临时调试的手段, 要求使用方式类似于printf, 在不需要时可容易地去除相关的调试语句.在必要的情况下可方便地扩展...
  • 嵌入式开发中,使用printf打印一些信息是一种常用的调试手段。但是,在打印的信息量比较多的时候,就比较难知道哪些信息在哪个函数里进行打印。特别是对于异常情况的打印,我们需要快速定位到异常情况的位置。 这...
  • C语言实现高效日志

    热门讨论 2009-05-28 16:35:01
    7.日志分为3个文件,debug.log保存调试日志信息,normal.log保存普通日志信息,error.log保存错误日志信息 8.日志安全性:日志文件达到一定容量后(目前设置为100M)会把原日志文件备份为.bak后缀的日志文件, 并...
  • C语言gdb调试之精髓(常用命令、多进程、多线程、程序日志) 起语: 版权声明: C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。 来源:C语言技术网(www.freecplus.net) 作者:码农有道 如果文章有...
  • 目录 linux下C语言编程打印log日志 linux下C语言编程打印log日志 前言 ​ linux的日志系统一直以来都是在linux上开发必学的一部分内容。之前在学习openstack的时候,在对openstack组件的发生的错误进行调试时,老师...
  • 写程序难免需要用到调试信息,由于某些原因,有的调试信息想把它放到系统日志中去。因此今天试验了一下分别在Linux和Android中用C语言写系统日志。 首先是在Linux中尝试写系统日志,关于这方面的资料网上已经很多...
  • 当我们需要测试程序运行时间,输出变量的值以用来调试时非常不方便,虽然linux中有gdb,Windows中有vs可进行调试。但在部分场景下,还是需要进行日志输出较为方便。为此,本人将本人在嵌入式开发过程中使用较多的...
  • 在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__ 先介绍几个编译器内置的宏定义,这些宏定义...
  • 建立Debug调试日志

    2018-09-28 11:57:10
    参考链接:1 ((sizeof(n)+sizeof(int)-1)&amp;~(sizeof(int)-1))  2 对C语言中va_list,va_start,va_arg和va_end的一点理解   3 C 库宏 - va_start()  4 vsnprintf函数用法 ...
  • 有利于程序的调试。 2)条件编译当然也可以用条件语句来实现,但是用条件语句将会对整个程序进行编译,生成的目标程序很长,而采用条件编译,则根据条件之编译其中的程序段1或者程序段2,生成目标程序较短。
  • 写程序难免需要用到调试信息,由于某些原因,有的调试信息想把它放到系统日志中去。因此今天试验了一下分别在Linux和Android中用C语言写系统 日志。首先是在Linux中尝试写系统日志,关于这方面的资料网上已经...
  • C语言实现简单的日志封装

    千次阅读 2016-12-19 21:32:36
    在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__ 先介绍几个编译器内置的宏定义,这些宏...
  • linux下C语言编程打印syslog日志

    千次阅读 2017-03-28 09:32:43
    之前在学习OpenStack的时候,在对openstack组件的发生的错误进行调试时,老师就说要多看日志的报错,从这里找到相关线索再去修改配置文件。结果很多的报错都是通过组件对应的日志文件反映出来而修改成功的,因此使用...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 143
精华内容 57
关键字:

c语言调试日志

c语言 订阅