Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: uglyangel   发起时间: 2009-11-19 22:59 下午   回复: 4

Print Search
帖子排序:    
   2009-11-19, 22:59 下午
uglyangel 离线,最后访问时间: 2016/5/21 11:16:32 uglyangel

发帖数前100位
男
注册: 2009-11-14
天津
发 贴: 11
Embarrassed [:$] 用户态查看Event的问题
Reply Quote

我刚学windbg没多久,弱弱的问个问题:

我的项目中出现了软件经常死,用windbg查看主线程的调用堆栈,发现最后调用的是别人的开发包,并且是kernel32!WaitForSingleObject;

用!handle + 第一个参数 + f查看,显示是Event。到这里就不会了,不知道具体还怎么看?怎么知道是哪个Event,是在哪里SetEvent的?

还可以怎么获得这个Event的更详细的信息?需要切换到本地内核模式吗?

高人指教下吧,先谢谢啊!


IP 地址: 已记录   报告
   2009-11-20, 00:45 上午
MJ0011 离线,最后访问时间: 2009/12/24 22:33:41 MJ0011

发帖数前10位
注册: 2008-04-24
发 贴: 112
Re: 用户态查看Event的问题
Reply Quote
!locks
IP 地址: 已记录   报告
   2009-12-10, 15:08 下午
neilhsu 离线,最后访问时间: 2009/12/23 17:02:23 手语

发帖数前10位
男
注册: 2008-06-06
发 贴: 73
Re: 用户态查看Event的问题
Reply Quote

请把死锁的CallStack贴上来

我估计,WaitForSingleObject()再往前就是EnterCriticalSection(),再往前就是LoadLibrary()/FreeLibrary()了。

如果是这样,估计你们的源代码在哪里调TerminateThread()/KillThread()了。

查查吧^_^

祝早日解决问题


鸿鹄安知燕雀之志
IP 地址: 已记录   报告
   2009-12-18, 09:05 上午
lgq198660837 离线,最后访问时间: 2009/12/19 14:35:08 Oak

发帖数前100位
注册: 2009-10-19
发 贴: 14
Re: 用户态查看Event的问题
Reply Quote
~*kb 查看各线程状态,重点关注kernel32!WaitForSingleObject ,里面有个参数正是要等待的Event地址
!handle 查看event的状态,以及属于哪个线程
然后就是逻辑推理了。
IP 地址: 已记录   报告
   2009-12-21, 22:02 下午
uglyangel 离线,最后访问时间: 2016/5/21 11:16:32 uglyangel

发帖数前100位
男
注册: 2009-11-14
天津
发 贴: 11
Re: 用户态查看Event的问题
Reply Quote
谢谢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的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.