起语:
版权声明
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