gdb 调试 coredump文件
- coredump文件又叫核心转储文件,是进程运行时突然崩溃的瞬间,进程在内存中的一个快照。会把进程此刻内存/寄存器状态/运行堆栈信息等存储在一个文件里
- 如果coredump文件没有产生怎么办
- 通过ulimit -a查看core file size 查看内核core文件大小限制,如果大小小于产生的coredump文件,那么就不会产生coredump文件,再看磁盘大小,如果磁盘空闲空间页不够,那也不会产生, 通过ulimit -c unlimited设置到无上限
- 命令
gdb 可执行文件 coredump文件
- 调试思路:
- 查看调用堆栈,分析崩溃原因。bt 查看栈帧 f n,n是编号,进入指定的栈帧号,通常最大编号是main,0是最后一个栈帧
- 根据崩溃点,查看代码分析原因
- 修复bug
gdb调试多线程程序
调试多线程时,需要使用调度器锁
- 运行需要调试的程序
- ps -aux | grep a.out 找到进程的pid
- top -Hp pid 查看进程的线程状况
- gdb attach pid 进入进程开始gdb调试
进入gdb后,info threads, thread n 进入第n线程
必须在线程创建完成后才能设置
- show secheduler-locking ,查看调度器锁
- set secheduler-locking off:不锁定任何线程,调试某一个线程时,其他线程也会继续运行(抢占式执行)
- set secheduler-locking on:只有当前线程可以运行
- set secheduler-locking step: 当单步调试某一个线程时,保证在调试过程中当前线程不会发生改变,其他线程也会随着被调试线程的单步执行而单步执行。如果该模式下执行continue、until、finish,其他线程也会执行,其他线程在这一过程遇到断点,gdb会切换到该线程