|
|
|
|
|
|
|
WinDbg
帖子发起人: uglyangel 发起时间: 2009-11-19 22:59 下午 回复: 4
|
帖子排序:
|
|
|
|
2009-11-19, 22:59 下午
|
uglyangel
注册: 2009-11-14
天津
发 贴: 11
|
用户态查看Event的问题
|
|
|
|
我刚学windbg没多久,弱弱的问个问题:
我的项目中出现了软件经常死,用windbg查看主线程的调用堆栈,发现最后调用的是别人的开发包,并且是kernel32!WaitForSingleObject;
用!handle + 第一个参数 + f查看,显示是Event。到这里就不会了,不知道具体还怎么看?怎么知道是哪个Event,是在哪里SetEvent的?
还可以怎么获得这个Event的更详细的信息?需要切换到本地内核模式吗?
高人指教下吧,先谢谢啊!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-20, 00:45 上午
|
MJ0011
注册: 2008-04-24
发 贴: 112
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-12-10, 15:08 下午
|
手语
注册: 2008-06-06
发 贴: 73
|
|
|
请把死锁的CallStack贴上来
我估计,WaitForSingleObject()再往前就是EnterCriticalSection(),再往前就是LoadLibrary()/FreeLibrary()了。
如果是这样,估计你们的源代码在哪里调TerminateThread()/KillThread()了。
查查吧^_^
祝早日解决问题
鸿鹄安知燕雀之志
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-12-18, 09:05 上午
|
Oak
注册: 2009-10-19
发 贴: 14
|
|
|
~*kb 查看各线程状态,重点关注kernel32!WaitForSingleObject ,里面有个参数正是要等待的Event地址
!handle 查看event的状态,以及属于哪个线程
然后就是逻辑推理了。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-12-21, 22:02 下午
|
uglyangel
注册: 2009-11-14
天津
发 贴: 11
|
|
|
谢谢MJ0011,!locks我只看到了临界区,没明白怎么解决WaitForSingleObject等Event的问题,惭愧!
谢谢手语,WaitForSingleObject()前并没有EnterCriticalSection(),如果有的话应该就很好解决了,!cs,~~[]就解决了.遗憾的是这不是临界区死锁!
谢谢0ak,您说的方法和手语类似,这里的一个关键的问题是我们用的是第三方的sdk,死锁的位置是他们的dll,没有代码,否则的话,一条!handle就解决了,遗憾!(另外发现!handle可以显示event的名称,却不是总能显示owning thread,是owning thread已经不在了?用的参数是f,不知道对不对?).
问题最终的解决方法是找到第三方的开发方拿到了他们的symbol文件,!handle直接指到了他们的代码行,问题解决.
新发现的问题:
我们的代码中有这样三条线程:A,B,C
A和B访问同一个vector V_ab,C访问另一个vector V_c,每个vector都有对应的临界区保护,分别是Cri_ab,Cri_c;访问方式是:__try{}__finally{}的方式.结果发现死锁.
跟踪发现的规律是:
1.去掉__try{}__finally{}没问题;
2.有__try{}__finally{}的情况下,改成单核模式没问题(我的系统是 xp sp3,双核);
3.写日志发现死锁是因为LeaveCriticSection的时候发生了紊乱.
问题是:
1.该问题是否和双核有关系.
2.双核的情况下怎么使用SEH.
该问题还在跟踪中(也没什么思路了,准备看一下多核编程方面的书),知道的指教下,谢谢啦!
(帖子有点长,测试代码是BCB下开发的,需要的话我整理一下发上来,有劳大家了).
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » WinDbg » Re: 用户态查看Event的问题
|
|
|
|
|
|