多进程、多线程调试

本文探讨了如何进行多进程和多线程的调试,通过启动GDB调试器(如示例中#gdb ./jccc)来定位并解决代码中的问题。重点在于理解和调试进程中线程同步、资源管理和通信等复杂情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//启动gdb调试

#gdb ./jccc 

//设置默认跟踪子进程
(gdb) set follow-fork-mode child

//设置当程序在gdb中停止,只有当前的线程会被停止,而其他的线程将会继续运行(gdb默认进程的所有线程都会停止)
(gdb) set non-stop on

//接下来设置断点
(gdb) b processCore.cpp:454

//运行jccc程序
(gdb) r -c /home/xiongli/workspace/PAAS/jchang/jc.conf
Starting program: /home/xiongli/workspace/PAAS/jchang/jccc -c /home/xiongli/workspace/PAAS/jchang/jc.conf
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
setrlimit 500000 ok
[New process 989]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff7aef700 (LWP 990)]
[Thread 0x7ffff7aef700 (LWP 990) exited]
[tcsetpgrp failed in terminal_inferior: No such process]
[New Thread 0x7ffff7aef700 (LWP 991)]
[New Thread 0x7ffff6ed0700 (LWP 992)]
[New Thread 0x7ffff64cf700 (LWP 994)]
[New Thread 0x7ffff5ace700 (LWP 995)]
[New Thread 0x7ffff50cd700 (LWP 996)]
[New Thread 0x7fffeffff700 (LWP 997)]
[New Thread 0x7fffef5fe700 (LWP 998)]
[New Thread 0x7fffeebfd700 (LWP 999)]

(这里我们看到4个线程因为断点停住了,其他线程如期运行)
Thread 2.8 "jccc" hit Breakpoint 1, thread_Processor (lpvoid=0x70f5e0) at processCore.cpp:454
warning: Source file is more recent than executable.
454                             if(!g_ProcessCore.m_MobileList.IsValid(fd))
(gdb) 
(gdb) 
(gdb) 
Thread 2.9 "jccc" hit Breakpoint 1, thread_Processor (lpvoid=0x70fbb0) at processCore.cpp:454
454                             if(!g_ProcessCore.m_MobileList.IsValid(fd))


Thread 2.10 "jccc" hit Breakpoint 1, thread_Processor (lpvoid=0x710190) at processCore.cpp:454
454                             if(!g_ProcessCore.m_MobileList.IsValid(fd))


Thread 2.7 "jccc" hit Breakpoint 1, thread_Processor (lpvoid=0x70edb0) at processCore.cpp:454

454 


//查看一下所有线程信息
(gdb) info threads
  Id   Target Id         Frame 
  2.1  Thread 0x7ffff7af17e0 (LWP 989) "jccc" (running)
  2.3  Thread 0x7ffff7aef700 (LWP 991) "jccc" (running)
  2.4  Thread 0x7ffff6ed0700 (LWP 992) "jccc" (running)
  2.5  Thread 0x7ffff64cf700 (LWP 994) "jccc" (running)
  2.6  Thread 0x7ffff5ace700 (LWP 995) "jccc" (running)
  2.7  Thread 0x7ffff50cd700 (LWP 996) "jccc" thread_Processor (lpvoid=0x70edb0) at processCore.cpp:454
  2.8  Thread 0x7fffeffff700 (LWP 997) "jccc" thread_Processor (lpvoid=0x70f5e0) at processCore.cpp:454
  2.9  Thread 0x7fffef5fe700 (LWP 998) "jccc" thread_Processor (lpvoid=0x70fbb0) at processCore.cpp:454
  2.10 Thread 0x7fffeebfd700 (LWP 999) "jccc" thread_Processor (lpvoid=0x710190) at processCore.cpp:454

//指定Id可以切换到任何线程,这里切换到要调试的线程
(gdb) thread 2.7
[Switching to thread 2.7 (Thread 0x7ffff50cd700 (LWP 996))]
#0  thread_Processor (lpvoid=0x70edb0) at processCore.cpp:454
454                             if(!g_ProcessCore.m_MobileList.IsValid(fd))

//接下来,单步调试当前线程
(gdb) p g_ProcessCore.m_MobileList.IsValid(fd)
$2 = true
(gdb) n
395             while(!g_bWantExit)
(gdb) 
397                     if(0!=pthread_mutex_lock(&(process->m_mutex_MobileTcpTask)))
(gdb) 
404                     while(process->m_MobileTcpTaskQueue.empty())
(gdb) 
414                     if(g_bWantExit)
(gdb) 
421                     fd = process->m_MobileTcpTaskQueue.front();
(gdb) 
422                     process->m_MobileTcpTaskQueue.pop();
(gdb) 
423                     int nQueueSize=process->m_MobileTcpTaskQueue.size();
(gdb) 
425                     write_log(Debug, "<Thread=%d> fd=%d,QSize=%d",nThreadIndex,fd,nQueueSize); 
(gdb) 
427                     if(0!=pthread_mutex_unlock(&(process->m_mutex_MobileTcpTask)))
(gdb) 

434                     memset(sLineData,0,sizeof(sLineData));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值