1、core文件介绍
核心文件(core file),也称核心转储(core dump),是操作系统在进程收到某些信号而终止运行时,根据此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。介绍一下core文件产生的方法:
1. 查看相关环境
ulimit -a
注:初始时,默认core file size为0,即不产生core文件
2. 设置产生core文件
ulimit -c 1024
设置core file size来开否core文件的产生,这里的1024是喜好值,可以根据实值情况调整;此时,当程序运行出错时,就会“出core”
3. 出core后,用gdb查看出错情况
出错后,当前目录下会出现core文件。通过命令:
gdb 可执行文件 core
即可以查看出错时的环境。
2、通过gdb调试
1. 首次需要在编译时加上-g参数,这是用gdb调试的前提。
2. 调试命令:
gdb 可执行文件名
即可以通过gdb对文件进行调试。
3、一般调试命令
1. 设置断点
默认在main函数所在文件加断点:
break 行数
在其他文件设置断点:
break 文件名:行数
2. 查看断点信息
info break
3. 运行程序
run
4. 单步调试
n
5. 继续运行程序
continue
6. 打印变量
print '文件名'::函数名::变量名
7. 查看函数堆栈
bt
8. 取消断点
delete 断点号
4、多线程调试
线程调试命令如下:
- info threads:显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。前面有*的是当前调试的线程。
- thread ID:切换当前调试的线程为指定ID的线程。
- break thread_test.c:123 thread all:在所有线程中相应的行上设置断点
- thread apply ID1 ID2 command:让一个或者多个线程执行GDB命令command。
- thread apply all command:让所有被调试线程执行GDB命令command。
- set scheduler-locking off|on|step:估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。