目录
当程序在函数中暂停后,即可查看函数的参数。语法如下: 或者 线程状态可以是以下几种: 调试时除了当前线程在运行,要想规定其他线程的运行情况用这个命令,有三个选择: 如果你想要对一个连续的线程ID范围内的所有线程应用命令,例如从线程ID 1到线程ID 10的所有线程 [gdb调试---多进程、线程]https://zhuanlan.zhihu.com/p/666440042 命令 non-stop模式下,在指定线程设置断点,不会中断其他线程
如何查看地址值
查看下一个地址: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 (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)
set scheduler-locking off
:不锁定任何线程,所有线程都可以继续执行,这是默认选项。set scheduler-locking on
:只有当前线程可以执行,其他线程暂停运行。set scheduler-locking step
: 当单步执行某一线程时,其它线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果该模式下执行 continue、until、finish 命令,则其它线程也会执行,并且如果某一线程执行过程遇到断点,则 GDB 调试器会将该线程作为当前线程。thread apply 1-10 command
只暂停指定线程,其他线程不影响
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.
总结
1 attach之前,set non-stop on
2 attach 进程id
3 set scheduler-locking on
4 thread apply all c & 恢复所有线程为运行态
5 开始给ctp动态库底层线程设置断点, b myselect thread 线程id
6 ctpApi_client触发ctp请求
7 gdb中ctp动态库底层线程触发断点,开始单步调试next