中文快速入门:

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 多线程调试的更多相关文章

  1. 利用GDB进行多线程调试

    一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...

  2. gdb的多线程调试

    info threads 可以查看当前进程有哪些线程 thread ID 可以切换到线程ID bt 查看当前线程堆栈 set scheduler-locking on多线程调试过程中, 线程会来回切换 ...

  3. gdb进行多线程调试

    http://blog.csdn.net/xabc3000/article/details/6819867 http://www.cnblogs.com/xuxm2007/archive/2011/0 ...

  4. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断

    多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...

  5. 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  6. gdb 多线程调试

    gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html  http://hi.baidu.com/lit ...

  7. GDB多线程调试

    一.多线程调试1. 多线程调试,最重要的几个命令:info threads                        查看当前进程的线程.                              ...

  8. GDB常用调试命令以及多进程多线程调试

    http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令   1.list命令 list  linenum      显示程序第l ...

  9. 多线程调试必杀技 - GDB的non-stop模式

     作者:破砂锅  (转) 开源的GDB被广泛使用在Linux.OSX.Unix和各种嵌入式系统(例如手机),这次它又带给我们一个惊喜. 多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持a ...

随机推荐

  1. PHP PDO的FETCH_NUM、FETCH_BOTH、FETCH_ASSOC

    不容易混淆的有:FETCH_CLASS,FETCH_COLUMN,FETCH_OBJ... 数据库的连接准备部分 $dsn = 'mysql:host=127.0.0.1;port=3306;dbna ...

  2. SoapUI 设置 request data with json body

    --背景 使用WCF定义REST风格的WebService,如下: [ServiceContract]    public interface INISTService    {        [Op ...

  3. Servlet 之 ServletContext

    package cn.jiemoxiaodi.servlet_servletcontext; import java.io.IOException; import java.io.PrintWrite ...

  4. 「转」xtrabackup新版详细说明

    声明:本文由我的同事@fiona514编写,是我看过的最用心的中文说明介绍,强烈推荐大家学习使用. Percona Xtrabackup 2.4.1 编译及软件依赖 centos5,6 需要升级cma ...

  5. genymotion安装及问题解决

     1.首先下载安装genymotion 这个现在安装教程有很多,大家自行百度一下. 下载地址:https://www.genymotion.com/download/# 我的是win10系统,64位, ...

  6. TableView 隐藏多余的分割线

    - (void)setExtraCellLineHidden: (UITableView *)tableView { UIView *view = [UIView new]; view.backgro ...

  7. vagrant学习笔记

    什么是vagrant简而言之,vagrant就是一个用来管理虚拟机文件的工具为什么要使用vagra如果经常玩虚拟机的话,就会知道,当你需要新建一个虚拟环境的时候,总是要重复的安装操作系统,以及操作系统 ...

  8. android系统中自带的一些ThemeStyle

    1 android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" 布局页面最上面 不会显示  and ...

  9. cdn

    cdn内容分发网络: 1. 内容缓存Web cache技术,反向代理 2. 集群服务与负载均衡技术 LVS(四层) 与 nginx(七层) 3. 全局负载均衡工作原理:基于DNS解析的GSLB实现机制 ...

  10. Session和Cache的区别

    以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application.其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息.Session则保存 ...