Chinaunix首页 | 论坛 | 博客
  • 博客访问: 835856
  • 博文数量: 91
  • 博客积分: 2544
  • 博客等级: 少校
  • 技术积分: 1885
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-12 09:08
文章存档

2016年(10)

2014年(2)

2013年(4)

2012年(23)

2011年(23)

2010年(13)

2009年(14)

2007年(2)

分类: C/C++

2009-06-10 20:50:43


=多进程调试=
* gdb 如何调试多进程
 ** 使用attach 命令
1,新建一个临时文件(内容任意),在需要调试的代码的地方加入一个调试小程序,如:

  1. debug();
  2. func();
  1. void
  2. debug(void)
  3. {
  4.      for ( ; ; ) {
  5.         if (access("temp", F_OK) < 0)      //temp是本地的一个文件
  6.             break;
  7.     }
  8. }

2,把程序运行起来,用ps命令找到需要调试进程的进程号,如果是网络程序,可以用命令netstat帮助查找
此时程序会停留在debug处.
3,把这子进程粘上来,在debug()的下一行打断点,进行下面的操作:
gdb> attach pid
gdb>break(b) num        //num 是debug()的下一行号
4, 现在可以把temp这个文件删除了,然后输入下面的命令:
gdb>continue(c)
现在程序停留在debug下面一行,你可以运行s,n等命令进行调试了.
小结: 优点: 该方法可以调试各种复杂的进程模型程序. 比较实用.
      缺点: 需要添加一小段代码.

**set follow-fork-mode child
使用该命令调试多进程程序时的步骤如下:
1, 启动gdb,并执行一下命令:

gdb>file runpro

//如果最后一个参数是parent那么在调用fork后,gdb会跟踪parent进程,

//如果是child则跟踪子进程,这样你就可以先在需要调试的地方打上断点了。
gdb>set follow-fork-mode child

gdb>break num                      //num 是子进程运行部分的行号
这样程序就停在子进程的断点处,现在可以调试子进程部分了.

** 在水木上看到一种方法,很好

(gdb)break fork
..
(gdb)run
..
(gdb)return 0
//这样fork被认为是返回0,就到子进程里面了
 小结: 缺点:如果有多个子进程的话,这种方法只能跟踪其中的一个子进程.
           优点: 该方法比较简单,不用添加额外的代码.

=常用操作=

*如何查看一个函数的定义
(gdb) list(l) functionname

*如何进入和跳出函数?
gdb> b(break)  n         #fun()所在的行
gdb> s(step)             #进入函数
gdb> finish  或 return   #跳出函数

*如何打印一个结构或数组的值?
**打印结构的值
gdb>print(p) *structname  
**打印一个数组的len个值
gdb>p *arrayname@len

*如何查看应用程序中定义的宏

gcc -gdwarf-2 -g3 编译就可以在gdb里面看macro定义

*gdb中如何查看我的程序运行到哪一行了?
gdb)bt
 
*一个调试问题(SIGSEGV)
(1)
 gcc -g 编译
ulimit -c 20000
之后运行程序,等core dump
最后
gdb -c core 
来查调用栈
(2)使用strace execfile

* 如何跳过一个循环体?
gdb>h until

* 如何给gdb调试的程序加参数
gdb obj
gdb>run arg1 arg2

阅读(1812) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~