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

浙公网安备 33010602011771号