如何调试多线程的程序?高手请进。push者有分

puppet 2003-09-15 05:02:28
如题
...全文
116 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vcforever 2003-09-16
1、对一条特定的线程进行调试
Visual C++调试器支持多线的情况,如果你在许多线程都调用的函数中
设置一个断点,每当一个线程遭遇到此断点,调试器就会在线程之间循环切换
有个方法可以避开这个问题,就是挂起所有线程,除了你感兴趣的那条(要调试
的那条),在调试器中打开[Debug]菜单并选择[Thread]你就可以获得一个线程对
话框,在这里你可以挂起所有的线程,把你要调试的线程留下来,单独调试他

2、运转记录
就是让程序的关键部分显示出其发生的活动的一种方法!
就是在程序的关键部位(某一时刻你想知道他的状态)加上一些输出语句,比如
printf TRACE 等等,可以将信息输出到屏幕,也可以重定向到文件中,不要
用一些控件比如ListBox,因为ListBox也是一个窗口,在他的内部有自己的消息
循环,向ListBox中输出调试信息的时候,会引起不必要的线程切换(从当前
线程切换到ListBox的消息循环)非常耗时!这对多线程这种对时间很敏感的程序
来说有可能会影响运行的结果!
在GUI程序中也是可以拥有console窗口的,由于console窗口由系统的设备驱动
程序负责,即使你的程序当掉或在调试器中停止console窗口仍有反应!

3、内存记号(Memory Trails)
上面的两种方法执行的时间都稍长,有可能影响到程序运行的结果,Memory Trail
属于一种比较低阶的技术!
是用Memory Trail的方法:
你必须产生一个足够大的全局缓冲区,以及指向该缓冲区的全局指针,例如:
char gMemTrail[16384];
char *pMemTrail = gMemTrail;
当你想输出某些东西到屏幕上或文件中时,你就写个记号到MemTrail中
例如:
*pMemTrail++ = 'f';
你的程序的每一个追踪点都应该写一个不同的记号,不论什么时候你想要,或是
程序当掉之后,你可以利用调试器看看 memory trail中的内容!

3、硬件调试寄存器
只适用于Intel机器!
这个俺就不多说了,基本上很少用!

这就是俺的方法,还请各位指正!
回复
Coold 2003-09-16
断点,TRACE,线程ID
回复
ckp 2003-09-16
1、spy++
2、断点,跟踪。
回复
LeLeGhost 2003-09-16
写代码的时候多加一点这种:

#if _DEBUG
// 调试信息
#endif
回复
ZouMorn 2003-09-16
断点,跟踪
回复
foolfox008 2003-09-16
使用相关支持多线程调试的调试器啊,gdb,VC都可以
回复
zhanfer 2003-09-16
路过
回复
mfc168 2003-09-16
断点,TRACE,跟踪
回复
dreamchild 2003-09-16
push得分
回复
宇宙使者2017 2003-09-16
好,受益非浅!!!
回复
shuiyuntian 2003-09-16
厉害厉害,学习学习再学习!
回复
wenddy112 2003-09-16
学习
回复
fancy_kevin 2003-09-16
回复
bmon_xyz 2003-09-15
up
回复
masterz 2003-09-15
1. 线程开始时,print out threadID, thread name
2. 可以使用tls 变量,控制哪一个线程输出调试信息
3。 使用OutputDebugString + dbgviewer
4. GetThreadTimes 可以找到哪个线程在死循环
回复
puppet 2003-09-15
顶一顶
回复
gzshd 2003-09-15
up
回复
gzshd 2003-09-15
up
回复
UDX协议 2003-09-15
断点+TRACE + Logfile +线程ID,输出时间等信息,
我一般都用。
回复
xiaohyy 2003-09-15
我没什么高招,还是老老实实的断点+TRACE,呵呵。。学习。。
回复
加载更多回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2003-09-15 05:02
社区公告
暂无公告