python实战07调试pdb

Python多线程的时候调试的简单方法(thread.run)

https://blog.csdn.net/york1996/article/details/89305847

1
2
for thread in threads:
thread.run()#原本是thread.start()

OpenStack断点调试方法总结(重定向stdin,stdout实现远程调试)

https://zhuanlan.zhihu.com/p/63898351

通过这种方式可以实现远程调试,不过我们不用每次都写那么长一段代码,社区已经有实现了,只需要使用rpdb替换pdb即可进行远程调试,原理与之类似,

python 多线程断点调试(管道方法)

https://blog.csdn.net/DeathlessDogface/article/details/84074461
插入断点

1
2
import pdb
pdb.Pdb(stdin=open('/root/p_in','r+'),stdout=open('/root/p_out','w+')).set_trace()

创建管道

1
mkfifo /root/p_in /root/p_out

gdb调试多进程和多线程命令(设置follow-fork-mode)

https://blog.csdn.net/pbymw8iwm/article/details/7876797
设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。
follow-fork-mode detach-on-fork 说明

1
2
3
4
parent                   on               只调试主进程(GDB默认)
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

设置方法:set follow-fork-mode [parent|child] set detach-on-fork [on|off]

查询正在调试的进程:info inferiors
切换调试的进程: inferior
查询线程:info threads
切换调试线程:thread

Linux多进程和多线程的一次gdb调试实例(参考上面的)

https://typecodes.com/cseries/multilprocessthreadgdb.html

follow-fork-mode detach-on-fork 说明

1
2
3
4
parent              on          GDB默认的调试模式:只调试主进程
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

查看gdb默认的参数设置:

1
2
3
4
5
6
7
8
(gdb) show follow-fork-mode
Debugger response to a program call of fork or vfork is "parent".
(gdb) show detach-on-fork
Whether gdb will detach the child of a fork is on.

catch fork
info b
bt

线程的查看以及利用gdb调试多线程(详细,截图中标示含义)

https://blog.csdn.net/zhangye3017/article/details/80382496

pstree -p xx

pstack xx

gdb attach 主线程ID

常用命令

1
2
3
4
1.查看进程:info inferiors
2.查看线程:info threads
3.查看线程栈结构:bt
4.切换线程:thread n(n代表第几个线程)

执行线程2的函数,指行完毕继续运行到断点处

1
2
1. 继续使某一线程运行:thread apply 1-n(第几个线程) n
2. 重新启动程序运行到断点处:r

只运行当前线程

1
2
1. 设置:set scheduler-locking on
2. 运行:n

所有线程并发执行

1
2
1. 设置:set scheduler-locking off
2. 运行:n

GDB多线程多进程调试(操作和命令对应)

https://cloud.tencent.com/developer/article/1142947

thread thread-id实现不同线程之间的切换
info threads查询存在的线程
thread apply [thread-id-list] [all] args在一系列线程上执行命令
线程中设置指定的断点
set print thread-events控制打印线程启动或结束是的信息

set scheduler-locking off|on|step在使用step或是continue进行调试的时候,其他可能也会并行的执行,如何才能够只让被调试的线程执行呢?该命令工具可以达到这个效果。
off:不锁定任何线程,也就是所有的线程都执行,这是默认值。
on:只有当前被调试的线程能够执行。
step:阻止其他线程在当前线程单步调试时,抢占当前线程。只有当next、continue、util以及finish的时候,其他线程才会获得重新运行的机会。

使用thread apply来让一个或是多个线程执行指定的命令。例如让所有的线程打印调用栈信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(gdb) thread apply all bt

Thread 3 (Thread 0x7ffff688a700 (LWP 20568)):
#0 0x00007ffff7138a3d in nanosleep () from /lib64/libc.so.6
#1 0x00007ffff71388b0 in sleep () from /lib64/libc.so.6
#2 0x000000000040091e in threadPrintWorld (arg=0x0) at multithreads.cpp:18
#3 0x00007ffff74279d1 in start_thread () from /lib64/libpthread.so.0
#4 0x00007ffff71748fd in clone () from /lib64/libc.so.6

Thread 2 (Thread 0x7ffff708b700 (LWP 20567)):
#0 threadPrintHello (arg=0x0) at multithreads.cpp:10
#1 0x00007ffff74279d1 in start_thread () from /lib64/libpthread.so.0
#2 0x00007ffff71748fd in clone () from /lib64/libc.so.6

Thread 1 (Thread 0x7ffff7fe5720 (LWP 20564)):
#0 0x00007ffff7138a3d in nanosleep () from /lib64/libc.so.6
#1 0x00007ffff71388b0 in sleep () from /lib64/libc.so.6
#2 0x00000000004009ea in main (argc=1, argv=0x7fffffffe628) at multithreads.cpp:47

参考

pyrasite(4年前的老项目,久不更新)
线程的查看以及利用gdb调试多线程(同上,但多了“安装的pstack有问题,自实现”,但pstack依然乱码):https://www.cnblogs.com/fengtai/p/12181907.html

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×