[skill][gdb] gdb 多线程调试
中文快速入门:
http://coolshell.cn/articles/3643.html (关于多线程的部署说的并不太对)
进阶:
多进程相关概念:
inferiors 是什么?
http://moss.cs.iit.edu/cs351/gdb-inferiors.html
多线程怎么调试:
分 all-stop 和 non-stop 两个模式。
all-stop 模式下,一个断点。所以线程全部终止运行。
使用 set non-stop on命令可以进入non-stop模式。其他线程不会受到一个线程停止的影响。
例如:non-stop模式下设置了一个中断: 其他线程正常运行。
(gdb) info thread
Id Target Id Frame
Thread 0x7fffb45fc700 (LWP ) "lcore-slave-7" (running)
* Thread 0x7fffb4dfd700 (LWP ) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb55fe700 (LWP ) "lcore-slave-3" (running)
Thread 0x7fffb5dff700 (LWP ) "eal-intr-thread" (running)
Thread 0x7ffff7fef8c0 (LWP ) "l3fwd" (running)
(gdb)
例如:all-stop模式下,scheduler-locking off 时:一个线程中断,所有线程都中断
Breakpoint , lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
(gdb) info thread
Id Target Id Frame
* Thread 0x7fffb45fc700 (LWP ) "lcore-slave-7" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb4dfd700 (LWP ) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb55fe700 (LWP ) "lcore-slave-3" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb5dff700 (LWP ) "eal-intr-thread" 0x00007ffff71e62c3 in epoll_wait () from /lib64/libc.so.
Thread 0x7ffff7fef8c0 (LWP ) "l3fwd" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
(gdb) show non-stop
Controlling the inferior in non-stop mode is off.
(gdb) show scheduler-locking
Mode for locking scheduler during execution is "off".
(gdb)
(gdb) c
Continuing.
[Switching to Thread 0x7fffb4dfd700 (LWP 10107)] Breakpoint 6, lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07.1/examples/l3fwd/l3fwd_lpm.c:177
177 nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
(gdb) info thread
Id Target Id Frame
5 Thread 0x7fffb45fc700 (LWP 10108) "lcore-slave-7" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07.1/examples/l3fwd/l3fwd_lpm.c:177
* 4 Thread 0x7fffb4dfd700 (LWP 10107) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07.1/examples/l3fwd/l3fwd_lpm.c:177
3 Thread 0x7fffb55fe700 (LWP 10106) "lcore-slave-3" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07.1/examples/l3fwd/l3fwd_lpm.c:177
2 Thread 0x7fffb5dff700 (LWP 10105) "eal-intr-thread" 0x00007ffff71e62c3 in epoll_wait () from /lib64/libc.so.6
1 Thread 0x7ffff7fef8c0 (LWP 10104) "l3fwd" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07.1/examples/l3fwd/l3fwd_lpm.c:177
(gdb) c
Continuing.
scheduler-locking 等于 on时。线程的调试,单步执行。其他线程都不运行改变其当前执行位置。
(gdb) thread
[Switching to thread (Thread 0x7ffff7fef8c0 (LWP ))]
# lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
(gdb) info thread
Id Target Id Frame
Thread 0x7fffb45fc700 (LWP ) "lcore-slave-7" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb4dfd700 (LWP ) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb55fe700 (LWP ) "lcore-slave-3" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb5dff700 (LWP ) "eal-intr-thread" 0x00007ffff71e62c3 in epoll_wait () from /lib64/libc.so.
* Thread 0x7ffff7fef8c0 (LWP ) "l3fwd" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
(gdb) n
if (nb_rx == )
(gdb) n
continue;
(gdb) n
for (i = ; i < qconf->n_rx_queue; ++i) {
(gdb) info thread
Id Target Id Frame
Thread 0x7fffb45fc700 (LWP ) "lcore-slave-7" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb4dfd700 (LWP ) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb55fe700 (LWP ) "lcore-slave-3" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb5dff700 (LWP ) "eal-intr-thread" 0x00007ffff71e62c3 in epoll_wait () from /lib64/libc.so.
* Thread 0x7ffff7fef8c0 (LWP ) "l3fwd" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
(gdb)
当 scheduler-locking 切换成 off,当进程执行一个next,其他进程就都执行了,并且被中断到其他线程里。承接上图代码:
如果每一个线程里都有中断,这种情况下,完全无法进行单步调试。
(gdb) set scheduler-locking off
(gdb) info thread
Id Target Id Frame
Thread 0x7fffb45fc700 (LWP ) "lcore-slave-7" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb4dfd700 (LWP ) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb55fe700 (LWP ) "lcore-slave-3" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb5dff700 (LWP ) "eal-intr-thread" 0x00007ffff71e62c3 in epoll_wait () from /lib64/libc.so.
* Thread 0x7ffff7fef8c0 (LWP ) "l3fwd" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
(gdb) n
[Switching to Thread 0x7fffb4dfd700 (LWP )] Breakpoint , lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
(gdb) info thread
Id Target Id Frame
Thread 0x7fffb45fc700 (LWP ) "lcore-slave-7" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
* Thread 0x7fffb4dfd700 (LWP ) "lcore-slave-6" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb55fe700 (LWP ) "lcore-slave-3" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
Thread 0x7fffb5dff700 (LWP ) "eal-intr-thread" 0x00007ffff71e62c3 in epoll_wait () from /lib64/libc.so.
Thread 0x7ffff7fef8c0 (LWP ) "l3fwd" lpm_main_loop (dummy=0x0) at /root/src/sdk/@dpdk/dpdk-stable-16.07./examples/l3fwd/l3fwd_lpm.c:
(gdb)
还有一个step模式。含义是:当用"step"命令调试线程时,其它线程不会执行,但是用其它命令(比如"next")调试线程时,其它线程也许会执行。
应该是还有一些特殊情况的,不过含义既如此!
https://sourceware.org/gdb/current/onlinedocs/gdb/Thread-Stops.html#Thread-Stops
总结一下:
0. set non-stop on 之前需要设置 set pagination off
1. 对整个进程全局调试,即哪里有中断就断到哪里。断的时候,整个进程停止执行。
此时,使用默认设置: non-step = off scheduler-locking = off
2. 需要专心调试一个线程,其他线程保持正常运行状态。
使用 non-step = on
3. 需要专心调试一个线程,其他线程保持停止状态,并且不影响当前线程。
使用 non-stop = off scheduler-locking = on
4. 还没遇到我需要这个场景的时候
使用 non-stop = off scheduler-locking = step
一个真实的多线程调试例子:
1。 程序正常启动了 (在这和gdb还没有关系)
[root@dpdk build]# ./l3fwd -l2,,, -- -p3 --config "(0,0,2),(1,0,6)" --parse-ptype
EAL: Detected lcore(s)
EAL: Probing VFIO support...
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
... ...
2. 启动gdb,并设一设,然后后台attach。
TODO: 并不知道,attach出来的进程如何non-stop。且该进程也不支持 attach &
[skill][gdb] gdb 多线程调试的更多相关文章
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- gdb的多线程调试
info threads 可以查看当前进程有哪些线程 thread ID 可以切换到线程ID bt 查看当前线程堆栈 set scheduler-locking on多线程调试过程中, 线程会来回切换 ...
- gdb进行多线程调试
http://blog.csdn.net/xabc3000/article/details/6819867 http://www.cnblogs.com/xuxm2007/archive/2011/0 ...
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...
- 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令
gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...
- gdb 多线程调试
gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/lit ...
- GDB多线程调试
一.多线程调试1. 多线程调试,最重要的几个命令:info threads 查看当前进程的线程. ...
- GDB常用调试命令以及多进程多线程调试
http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list linenum 显示程序第l ...
- 多线程调试必杀技 - GDB的non-stop模式
作者:破砂锅 (转) 开源的GDB被广泛使用在Linux.OSX.Unix和各种嵌入式系统(例如手机),这次它又带给我们一个惊喜. 多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持a ...
随机推荐
- PHP PDO的FETCH_NUM、FETCH_BOTH、FETCH_ASSOC
不容易混淆的有:FETCH_CLASS,FETCH_COLUMN,FETCH_OBJ... 数据库的连接准备部分 $dsn = 'mysql:host=127.0.0.1;port=3306;dbna ...
- SoapUI 设置 request data with json body
--背景 使用WCF定义REST风格的WebService,如下: [ServiceContract] public interface INISTService { [Op ...
- Servlet 之 ServletContext
package cn.jiemoxiaodi.servlet_servletcontext; import java.io.IOException; import java.io.PrintWrite ...
- 「转」xtrabackup新版详细说明
声明:本文由我的同事@fiona514编写,是我看过的最用心的中文说明介绍,强烈推荐大家学习使用. Percona Xtrabackup 2.4.1 编译及软件依赖 centos5,6 需要升级cma ...
- genymotion安装及问题解决
1.首先下载安装genymotion 这个现在安装教程有很多,大家自行百度一下. 下载地址:https://www.genymotion.com/download/# 我的是win10系统,64位, ...
- TableView 隐藏多余的分割线
- (void)setExtraCellLineHidden: (UITableView *)tableView { UIView *view = [UIView new]; view.backgro ...
- vagrant学习笔记
什么是vagrant简而言之,vagrant就是一个用来管理虚拟机文件的工具为什么要使用vagra如果经常玩虚拟机的话,就会知道,当你需要新建一个虚拟环境的时候,总是要重复的安装操作系统,以及操作系统 ...
- android系统中自带的一些ThemeStyle
1 android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" 布局页面最上面 不会显示 and ...
- cdn
cdn内容分发网络: 1. 内容缓存Web cache技术,反向代理 2. 集群服务与负载均衡技术 LVS(四层) 与 nginx(七层) 3. 全局负载均衡工作原理:基于DNS解析的GSLB实现机制 ...
- Session和Cache的区别
以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application.其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息.Session则保存 ...