gdb 条件断点 + 多线程 +attach

(gdb) stop
(gdb) b rte_pktmbuf_free  thread all
Junk after thread keyword.
(gdb) c
Continuing.
break if
用法:
break [break-args] if (condition)
例如:

break main if argc > 1
break 180 if (string == NULL && i < 0)
break test.c:34 if (x & y) == 1
break myfunc if i % (j + 3) != 0
break 44 if strlen(mystring) == 0

(gdb) info threads
  Id   Target Id         Frame 
  4    Thread 0xffff98fad910 (LWP 44106) "eal-intr-thread" 0x0000ffff990cf7c4 in __GI_epoll_pwait (epfd=6, 
    events=0xffff98facfe0, maxevents=<optimized out>, timeout=<optimized out>, set=0x0)
    at ../sysdeps/unix/sysv/linux/epoll_pwait.c:48
  3    Thread 0xffff9879d910 (LWP 44107) "rte_mp_handle" 0x0000ffff9918f928 in recvmsg ()
    at ../sysdeps/unix/syscall-template.S:83
  2    Thread 0xffff97f7d910 (LWP 44108) "lcore-slave-2" hinic_recv_pkts (rx_queue=0x13fe9be80, 
    rx_pkts=0xffff97f7ce80, nb_pkts=32) at /data1/dpdk-19.11/drivers/net/hinic/hinic_pmd_rx.c:977
* 1    Thread 0xffff99375510 (LWP 44105) "pingpong" rte_eal_wait_lcore (slave_id=2)
    at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_launch.c:30
(gdb) thread 2  
[Switching to thread 2 (Thread 0xffff97f7d910 (LWP 44108))]
#0  hinic_recv_pkts (rx_queue=0x13fe9be80, rx_pkts=0xffff97f7ce80, nb_pkts=32)
    at /data1/dpdk-19.11/drivers/net/hinic/hinic_pmd_rx.c:977
977                             break;
(gdb) bt
#0  hinic_recv_pkts (rx_queue=0x13fe9be80, rx_pkts=0xffff97f7ce80, nb_pkts=32)
    at /data1/dpdk-19.11/drivers/net/hinic/hinic_pmd_rx.c:977
#1  0x0000000000465728 in reply_to_icmp_echo_rqsts ()
#2  0x00000000004674fc in pong_launch_one_lcore ()
#3  0x0000000000593ae8 in eal_thread_loop (arg=0x0)
    at /data1/dpdk-19.11/lib/librte_eal/linux/eal/eal_thread.c:153
#4  0x0000ffff99187d38 in start_thread (arg=0xffff97f7d910) at pthread_create.c:309
#5  0x0000ffff990cf5f0 in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:91
(gdb) 
(gdb) b rte_pktmbuf_prefree_seg
Breakpoint 1 at 0x467cf0: rte_pktmbuf_prefree_seg. (146 locations)
(gdb) thread apply all bt

Thread 4 (Thread 0xffff98fad910 (LWP 44106)):
#0  0x0000ffff990cf7c4 in __GI_epoll_pwait (epfd=6, events=0xffff98facfe0, maxevents=<optimized out>, 
    timeout=<optimized out>, set=0x0) at ../sysdeps/unix/sysv/linux/epoll_pwait.c:48
#1  0x000000000059d790 in eal_intr_handle_interrupts (pfd=6, totalfds=2)
    at /data1/dpdk-19.11/lib/librte_eal/linux/eal/eal_interrupts.c:1016
#2  0x000000000059d9b8 in eal_intr_thread_main (arg=0x0)
    at /data1/dpdk-19.11/lib/librte_eal/linux/eal/eal_interrupts.c:1100
#3  0x00000000005ada7c in rte_thread_init (arg=0x3c9e1810)
    at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_thread.c:165
#4  0x0000ffff99187d38 in start_thread (arg=0xffff98fad910) at pthread_create.c:309
#5  0x0000ffff990cf5f0 in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:91

Thread 3 (Thread 0xffff9879d910 (LWP 44107)):
#0  0x0000ffff9918f928 in recvmsg () at ../sysdeps/unix/syscall-template.S:83
#1  0x00000000005ae038 in read_msg (m=0xffff9879cf40, s=0xffff9879ced0)
    at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_proc.c:279
#2  0x00000000005ae450 in mp_handle (arg=0x0) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_proc.c:380
#3  0x00000000005ada7c in rte_thread_init (arg=0x3c9e1810)
    at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_thread.c:165
#4  0x0000ffff99187d38 in start_thread (arg=0xffff9879d910) at pthread_create.c:309
#5  0x0000ffff990cf5f0 in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:91

Thread 2 (Thread 0xffff97f7d910 (LWP 44108)):
#0  0x0000000000787064 in hinic_recv_pkts (rx_queue=0x13fe9be80, rx_pkts=0xffff97f7ce80, nb_pkts=32)
    at /data1/dpdk-19.11/drivers/net/hinic/hinic_pmd_rx.c:954
#1  0x0000000000465728 in reply_to_icmp_echo_rqsts ()
#2  0x00000000004674fc in pong_launch_one_lcore ()
#3  0x0000000000593ae8 in eal_thread_loop (arg=0x0)
    at /data1/dpdk-19.11/lib/librte_eal/linux/eal/eal_thread.c:153
---Type <return> to continue, or q <return> to quit---
#4  0x0000ffff99187d38 in start_thread (arg=0xffff97f7d910) at pthread_create.c:309
#5  0x0000ffff990cf5f0 in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:91

Thread 1 (Thread 0xffff99375510 (LWP 44105)):
#0  0x00000000005a26ac in rte_eal_wait_lcore (slave_id=2)
    at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_launch.c:29
#1  0x0000000000465124 in main ()
(gdb) 
gdb调试正在运行的进程:

GDB可以对正在执行的程序进行调度,它允许开发人员中断程序 并查看其状态,之后还能让这个程序正常地继续执行

(gdb) attach xxxxx --- xxxxx为利用ps命令获得的子进程process id
(gdb) stop --- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch
(gdb) break 37 -- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码
Breakpoint 1 at 0x10808: file eg1.c, line 37.
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step

 在完成调试之后,不要忘记用detach命令断开连接,让被调试的进程可以继续正常运行。
原文地址:https://www.cnblogs.com/dream397/p/13674796.html