目录
- 如何查看地址值
- 查看当前函数参数
- 多线程调试
- 只暂停指定线程,其他线程不影响
- 总结
如何查看地址值
查看下一个地址:x/x 0x12345679
以八进制显示:x/o 0x12345678
以十进制显示:x/d 0x12345678
显示更多的地址和值:x/8xw 0x12345678(显示从该地址开始的8个字(word),每个字以十六进制格式显示)
p /t __readfds->fds_bits[0] 二进制输出 /x 十六进制输出
查看当前函数参数
当程序在函数中暂停后,即可查看函数的参数。语法如下:
info args
或者
i args
多线程调试
线程状态可以是以下几种:
- D:不可中断睡眠状态(Uninterruptible Sleep),通常是因为在等待I/O
- R:正在运行或可运行(Running or Runnable),等待处理器调度
- S:可中断睡眠状态(Interruptible Sleep),通常是在等待某个事件完成
- T:已停止(Stopped),通常是由于收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号
- t:跟踪停止(Traced Stop),在被调试器暂停时发生
- Z:已僵尸(Zombie),已终止但未被其父进程清理
D (TASK_UNINTERRUPTIBLE) 不可中断的睡眠状态
R (TASK_RUNNING) 正在运行,或在队列中的进程
S (TASK_INTERRUPTIBLE) 可中断的睡眠状态
T (TASK_STOPPED) 停止状态
t (TASK_TRACED) 被跟踪状态
Z (TASK_DEAD - EXIT_ZOMBIE) 退出状态,但没被父进程收尸,成为僵尸状态
W 进入内存交换(从内核2.6开始无效)
X (TASK_DEAD - EXIT_DEAD) 退出状态,进程即将被销毁< 高优先级
N 低优先级
L 有些页被锁进内存
s 包含子进程
+ 位于前台的进程组;
l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
用 GDB 调试多线程程序_gdb多线程-CSDN博客
调试时除了当前线程在运行,要想规定其他线程的运行情况用这个命令,有三个选择:
set scheduler-locking off
:不锁定任何线程,所有线程都可以继续执行,这是默认选项。set scheduler-locking on
:只有当前线程可以执行,其他线程暂停运行。set scheduler-locking step
: 当单步执行某一线程时,其它线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果该模式下执行 continue、until、finish 命令,则其它线程也会执行,并且如果某一线程执行过程遇到断点,则 GDB 调试器会将该线程作为当前线程。
如果你想要对一个连续的线程ID范围内的所有线程应用命令,例如从线程ID 1到线程ID 10的所有线程
thread apply 1-10 command
只暂停指定线程,其他线程不影响
[gdb调试---多进程、线程] https://zhuanlan.zhihu.com/p/666440042
gdb调试多线程,默认采用all-stop
模式,即只要有一个线程暂停执行,其他线程都会暂停。
有时调试其他线程,其他线程正常化执行,可以将all-stop
模式改为non-stop
模式,即暂停某一线程,不会影响其他线程
命令show non-stop
查看当前的non-stop模式状态
(gdb) show non-stop
Controlling the inferior in non-stop mode is off.
命令set non-stop [mode]
查看当前的non-stop模式状态
(gdb) set non-stop on
(gdb) show non-stop
Controlling the inferior in non-stop mode is on.
non-stop模式下,在指定线程设置断点,不会中断其他线程
总结
attach之前,set non-stop on
attach 进程id
set scheduler-locking on
thread apply all c & 恢复所有线程为运行态
开始给ctp动态库底层线程设置断点, b myselect thread 线程id
ctpApi_client触发ctp请求
gdb中ctp动态库底层线程触发断点,开始单步调试next