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

帖子发起人: guozf   发起时间: 2010-04-21 14:00 下午   回复: 7

Print Search
帖子排序:    
   2010-04-21, 14:00 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Zip it! [:#] WinDbg的一個bug?
Reply Quote
最近在做一个项目。大概是这样的:在WInDbg下,对目标进程设置一些断点,在断点trigger的时候自动执行制定的一些命令(可以为build-in 命令,或者是一些扩展的命令),执行完之后不停下来继续运行。原理如下: bp Debuggee2!CMyTester::SubTestingProc "r $t0=@$t0+1;r $t0;g"

有了这样的功能,我们写一些扩展的命令,我们就可以在不重新编译程序的情况下,改变目标进程运行逻辑或者记录目标进程的运行情况(比如纪录局部变量或者全局变量)等等。进一步可以用它来做一些自动化的测试功能。

一开始进展很顺利。

最近碰到的问题感觉让我很沮丧。特地来此求教各位高人和老师

问题描述:

            如果目标断点被多个线程同时调用,这样WinDbg会漏掉一些断点。

测试程序代码:

void CMyTester::TestingProc1()
{
 while (1) {
  SubTestingProc(m_nCounter1);
  if (m_nCounter1>=0x100) {
   break;
  }
  m_nCounter1 += 1;
 }
}
void __cdecl WorkingThreadProc1(void *pArg)
{
 UINT   nIndex = (UINT)pArg;
 CMyTester  tester(nIndex); 

 tester.TestingProc1();
}
void CDebuggee2Dlg::CreateNewThreads(int nOption)
{
 for (int i=0; i<3; ++i) {
  _beginthread(WorkingThreadProc1, 0, (PVOID)nOption); 
 }
}


IP 地址: 已记录   报告
   2010-04-21, 15:27 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg的一個bug?
Reply Quote

测试脚本(main.txt)

$$ main.txt
$$ *********************************************************************************************
.expr       /s          masm
.load       pmext.dll
bc*
$$ *********************************************************************************************
sxn     ld
sxn     ud
sxi     out
sxd     eh
sxd     av
sxd     dm
sxd     gp
sxd     ip
sxd     dz
sxd     iov
sxd     ch
$$ *********************************************************************************************
.bpsync 0
bp Debuggee2!CMyTester::SubTestingProc "r $t0=@$t0+1;r $t0;g"
bl
$$ *********************************************************************************************
g
$$ *********************************************************************************************


开始测试德bat文件

         C:\WinDbg\WinDbg.exe -c "$$< C:\WinDbg\products\MutiThread2\main.txt" c:\WinDbgSample\src\Debuggee2\Debug\Debuggee2.exe

 


IP 地址: 已记录   报告
   2010-04-21, 15:28 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg的一個bug?
Reply Quote

WinDbg的输出结果

Opened log file 'C:\WinDbg\products\Debuggee2_2010-04-20_13-55-07\log\Debuggee2.log'

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: c:\WinDbgSample\src\Debuggee2\Debug\Debuggee2.exe
Symbol search path is: SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Wed Apr 21 13:34:37.524 2010 (UTC + 8:00): ModLoad: 00400000 00430000   Debuggee2.exe
Wed Apr 21 13:34:37.539 2010 (UTC + 8:00): ModLoad: 7c900000 7c9b0000   ntdll.dll
Wed Apr 21 13:34:37.586 2010 (UTC + 8:00): ModLoad: 7c800000 7c8f5000   C:\WINDOWS\system32\kernel32.dll
Wed Apr 21 13:34:37.586 2010 (UTC + 8:00): ModLoad: 7c140000 7c31c000   C:\WINDOWS\system32\MFC70D.DLL
Wed Apr 21 13:34:37.586 2010 (UTC + 8:00): ModLoad: 10200000 10285000   C:\WINDOWS\system32\MSVCR70D.dll
Wed Apr 21 13:34:37.586 2010 (UTC + 8:00): ModLoad: 77f10000 77f57000   C:\WINDOWS\system32\GDI32.dll
Wed Apr 21 13:34:37.602 2010 (UTC + 8:00): ModLoad: 7e410000 7e4a0000   C:\WINDOWS\system32\USER32.dll
Wed Apr 21 13:34:37.602 2010 (UTC + 8:00): ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
Wed Apr 21 13:34:37.602 2010 (UTC + 8:00): ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
Wed Apr 21 13:34:37.602 2010 (UTC + 8:00): ModLoad: 77e70000 77f01000   C:\WINDOWS\system32\RPCRT4.dll
Wed Apr 21 13:34:37.602 2010 (UTC + 8:00): ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
Wed Apr 21 13:34:37.602 2010 (UTC + 8:00): ModLoad: 74c80000 74cac000   C:\WINDOWS\system32\OLEACC.dll
Wed Apr 21 13:34:37.618 2010 (UTC + 8:00): ModLoad: 76080000 760e5000   C:\WINDOWS\system32\MSVCP60.dll
Wed Apr 21 13:34:37.618 2010 (UTC + 8:00): ModLoad: 774e0000 7761d000   C:\WINDOWS\system32\ole32.dll
Wed Apr 21 13:34:37.618 2010 (UTC + 8:00): ModLoad: 77120000 771ac000   C:\WINDOWS\system32\OLEAUT32.dll
Wed Apr 21 13:34:37.618 2010 (UTC + 8:00): ModLoad: 773d0000 774d3000   C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\COMCTL32.dll
Wed Apr 21 13:34:37.633 2010 (UTC + 8:00): (a20.6dc): Break instruction exception - code 80000003 (first chance)
eax=00261eb4 ebx=7ffde000 ecx=00000004 edx=00000010 esi=00261f48 edi=00261eb4
eip=7c901230 esp=0013fb20 ebp=0013fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c901230 cc              int     3
Processing initial command '$$< C:\WinDbg\products\MutiThread2\main.txt'
0:000> $$< C:\WinDbg\products\MutiThread2\main.txt
0:000> $$ main.txt
0:000> $$ *********************************************************************************************
0:000> .expr       /s          masm
Current expression evaluator: MASM - Microsoft Assembler expressions
0:000> .load       pmext.dll
0:000> bc*
0:000> $$ *********************************************************************************************
0:000> sxn     ld
0:000> sxn     ud
0:000> sxi     out
0:000> sxd     eh
0:000> sxd     av
0:000> sxd     dm
0:000> sxd     gp
0:000> sxd     ip
0:000> sxd     dz
0:000> sxd     iov
0:000> sxd     ch
0:000> $$ *********************************************************************************************
0:000> .bpsync 0
Breakpoint synchronization disabled
0:000> bp Debuggee2!CMyTester::SubTestingProc "r $t0=@$t0+1;r $t0;g"
*** WARNING: Unable to verify checksum for Debuggee2.exe
0:000> bl
 0 e 00414470     0001 (0001)  0:**** Debuggee2!CMyTester::SubTestingProc "r $t0=@$t0+1;r $t0;g"
0:000> $$ *********************************************************************************************
0:000> g
Command file caused an implicit wait
Command file execution failed, HRESULT 0x80004005
    "Unspecified error"
Wed Apr 21 13:34:37.711 2010 (UTC + 8:00): ModLoad: 5cb70000 5cb96000   C:\WINDOWS\system32\ShimEng.dll
Wed Apr 21 13:34:37.727 2010 (UTC + 8:00): ModLoad: 76390000 763ad000   C:\WINDOWS\system32\IMM32.DLL
Wed Apr 21 13:34:37.727 2010 (UTC + 8:00): ModLoad: 629c0000 629c9000   C:\WINDOWS\system32\LPK.DLL
Wed Apr 21 13:34:37.727 2010 (UTC + 8:00): ModLoad: 74d90000 74dfb000   C:\WINDOWS\system32\USP10.dll
Wed Apr 21 13:34:37.743 2010 (UTC + 8:00): ModLoad: 5d360000 5d36e000   C:\WINDOWS\system32\MFC70ENU.DLL
Wed Apr 21 13:34:37.758 2010 (UTC + 8:00): Unload module C:\WINDOWS\system32\ShimEng.dll at 5cb70000
Wed Apr 21 13:34:37.774 2010 (UTC + 8:00): ModLoad: 74720000 7476b000   C:\WINDOWS\system32\MSCTF.dll
Wed Apr 21 13:34:37.774 2010 (UTC + 8:00): ModLoad: 77c00000 77c08000   C:\WINDOWS\system32\version.dll
Wed Apr 21 13:34:37.774 2010 (UTC + 8:00): Unload module C:\WINDOWS\system32\version.dll at 77c00000
Wed Apr 21 13:34:37.789 2010 (UTC + 8:00): ModLoad: 77b40000 77b62000   C:\WINDOWS\system32\apphelp.dll
Wed Apr 21 13:34:37.789 2010 (UTC + 8:00): ModLoad: 755c0000 755ee000   C:\WINDOWS\system32\msctfime.ime
Wed Apr 21 13:34:37.789 2010 (UTC + 8:00): ModLoad: 5ad70000 5ada8000   C:\WINDOWS\system32\UxTheme.dll
Wed Apr 21 13:34:37.805 2010 (UTC + 8:00): ModLoad: 10000000 10006000   C:\Program Files\Synergy\synrgyhk.dll
$t0=00000001
$t0=00000002
$t0=00000003
$t0=00000004
$t0=00000005
$t0=00000006
$t0=00000007
$t0=00000008
$t0=00000009
$t0=0000000a
$t0=0000000b
$t0=0000000c
$t0=0000000d
$t0=0000000e
$t0=0000000f
$t0=00000010
......

......

......
$t0=000002fe


IP 地址: 已记录   报告
   2010-04-21, 15:33 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg的一個bug?
Reply Quote
有类似开发经验的给个建议吧。
IP 地址: 已记录   报告
   2010-04-21, 21:51 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: WinDbg的一個bug?
Reply Quote

使用 .bpsync 1 可以解决错过断点的问题,为什么故意禁用这个功能呢?

 

 

 

 

 

 


IP 地址: 已记录   报告
   2010-04-22, 09:45 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg的一個bug?
Reply Quote

其实我是试验过这个.bpsync 1命令的。但是发现还是不能完全解决这个问题。

Raymond 老师对此有什么高见或者有建议?

非常感谢。


IP 地址: 已记录   报告
   2010-04-22, 19:45 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: WinDbg的一個bug?
Reply Quote

这里的症结是调试器需要在单步走过断点时,临时删除断点。执行.bpsync 1命令后,调试器会在单步时,冻结其它线程,在断点恢复后,再恢复所有线程,因此应该没有错过断点的问题了啊。不知道“不能完全解决”是什么意思?

如果怀疑.bpsync 1命令,那么可以手工实现类似的功能,就是在断点命中后,执行一次

~. t

也就是将当前线程单步一次。

然后再执行g


IP 地址: 已记录   报告
   2010-04-22, 20:46 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Zip it! [:#] Re: WinDbg的一個bug?
Reply Quote
谢谢Raymond的解答,看来我说话要肯定一点了。

“不能完全解决”的意思是用了这个命令和不用这个命令,结果都会错过一些断点。

Raymond 说的方法我明天实验一下再来分享结果。

Raymond 可否在百忙中抽空测试一下这个.bpsync 1啊?看是否我用法有误还是人品不好

呵呵,谢谢。

IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » Re: WinDbg的一個bug?

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