C++ 调试

gdb的基础命令

基础篇:

1. gdb exe_name  exe_param 调试的,必须使用start启动

2. 设置断点  b break 断点, 有三种形式:b+行号 ; b+方法名;  b+文件名:行号

3. 显示断点  info b

4. 删除断点  两种形式:全部删除del ; 指定删除 del + 编号

5. 下一步  n

6. 进入函数  s

7. 跳出函数 finish

8. 切入到下个断点  c   continue

9. 显示代码   l   list

10. 打印   二进制形式 x/auxd + 变量地址; 变量形式:p+变量名

11. 退出:q

12. 强制结束:ctl+x ctl+c

13. 保存: ctl+x ctl+s

 

高级篇:

有fork的情况,父子进程如何切换?

set follow-fork-mode  parent/child

 

线程之间的切换,锁定要调试的线程

set scheduler-locking on/off

 

主要讲述3种调试形式:

1. 普通gdb

2. 图形化gdb

3. Emacs下gdb调试

 

1. 普通gdb

当没有emacs和图形化的时候,用普通的gdb调试。 

语法命令:gdb  exe_name  exe_param

优点:显示不会出现乱码。

缺点:只能单行显示,无法统筹全局。

编译过程必须加 -g参数。 例如:g++ -Wall -g  xxx.cpp  -o exe_name

 

2. 图形化gdb

输入个"-" 减号,就进入到图形化。

ctrl+l 对乱码界面进行刷新。

 

3. emacs调试

在调试目录下,执行emacs,输入alt+x 启动minbuff, 在minbuff输入 gdb,

在 gdb --annotate=3 之后,输入  exe_name  exe_param

 

 

如何调试init_deamon()

void init_deamon()
{

//预编译:编译器如果定义了WIN32,则不执行。在某些条件下执行某些操作。条件编译。某些条件满足的情况,纳入。
#ifndef _WIN32  
  if (fork() > 0)
  {
    exit(0);
  }

  setsid();

  if (fork() > 0)
  {
    exit(0);
  }
#endif
}

调试的时候,会退出,这是因为父进程已经结束,子进程在后台运行形成了守护进程。

 

那怎么办呢?就是上面的高级篇的fork

set follow-fork-mode  parent/child

 

举例:

(gdb) start

(gdb) set follow-fork-mode child

当zk出现超时,通过设置断点的方式:b+ 290   start   c   的方法重新调试。

 

详情参考:

https://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/

===============

 

当emacs需要交互的时候,会切到minbuff中, 通过ctrl+g脱离minbuff

 

 

emacs编译和调试

emacs xxx.cpp

ctl+x ctl+s保存文件

 

alt+x  输入compile

g++ -Wall -g  xxx.cpp  -o exe_name

 

 

窗口切换:ctl+x o

 

 

posted @ 2014-06-05 22:32  青梗墨竹  阅读(404)  评论(0)    收藏  举报