2012-05-25 63 views
4

我想检查使用WinDBG的可执行文件的程序集,但我很难做到这一点。我想在程序中的第一条指令处设置一个断点,但是当我手动(使用模块的地址)尝试执行该操作时,WinDBG告诉我它在该位置“无法插入断点”,这是由于“对内存位置的访问无效。“在WinDBG中手动设置断点

我注意到,当我通过源代码GUI创建一个断点时,地址与我的模块的第一部分不一样(在我的例子中:“Win32FileOpen”,我写的一个简单程序。某些类型的头文件需要为我的模块的地址添加偏移量?

在另一个question中,我看到了这样一个建议:“我会尝试计算断点地址为:模块开始+代码开始+代码偏移量”,但不确定从哪里获取这些值。有人可以详细说明吗?

我不只是使用源GUI的原因是我希望能够通过一个我可能没有源/符号的程序来做到这一点。

如果有一个更简单的方法为马上开始我打开可执行的工作,请让我知道。 (例如,打开一个.exe文件,Olly立即向我显示该程序集,搜索引用的字符串给出了该模块的结果,等等。WinDBG似乎在ntdll.dll中启动了我,这对我来说通常不是很有用。)

0:000> lm 
start    end     module name 
00000000`00130000 00000000`0014b000 Win32FileOpen C (private pdb symbols) C:\cfinley\code\Win32FileOpen\Debug\Win32FileOpen.pdb 
00000000`73bd0000 00000000`73c2c000 wow64win (deferred)    
00000000`73c30000 00000000`73c6f000 wow64  (deferred)    
00000000`74fe0000 00000000`74fe8000 wow64cpu (deferred)    
00000000`77750000 00000000`778f9000 ntdll  (pdb symbols)   c:\symbols\mssymbols\ntdll.pdb\15EB43E23B12409C84E3CC7635BAF5A32\ntdll.pdb 
00000000`77930000 00000000`77ab0000 ntdll32 (deferred)    
0:000> bu 00000000`00130000 
0:000> bl 
0 e x86 00000000`001413a0  0001 (0001) 0:**** Win32FileOpen!main    <-- One that is generated via GUI 
1 e x86 00000000`00130000  0001 (0001) 0:**** Win32FileOpen!__ImageBase  <-- One I tried to set manually 
0:000> g 
Unable to insert breakpoint 1 at 00000000`00130000, Win32 error 0n998 
    "Invalid access to memory location." 
bp1 at 00000000`00130000 failed 
WaitForEvent failed 
ntdll!LdrpDoDebuggerBreak+0x31: 
00000000`777fcb61 eb00   jmp  ntdll!LdrpDoDebuggerBreak+0x33 (00000000`777fcb63) 

回答

10

您应该能够使用以下列出所有你的DLL入口点:

x myDLL!* 

但被警告,这将列出一切,

如果你想只是Win32FileOpen:

x myDLL!*Win32FileOpen* 

会列出所有匹配的内容,这将列出您可以设置断点的正确地址。

您对补偿的其他问题,您可以设置一个方法名称或地址断点,并添加偏移:

bp myDLL!Win32FileOpen+0xa 

如果打开exectuable会的DebugBreak立即,可能不启动加载的dll文件,如果这是一个问题,那么你可以设置断点悬而未决:

bu myDLL!Win32FileOpen 

或仅仅是应用程序启动时连接,列出字符串,然后设置断点。

您也可以考虑设置在源代码行断点:

bp `myDLL!mySourceFile.cpp:XXX` 

其中XXX是行号,注意,您必须使用重音符到丹麦的源代码行,希望这有助于。

编辑

刚刚发现这个链接可能会感兴趣的你:http://mattoh.wordpress.com/2010/08/06/setting-breakpoint-on-entry-poin-with-windbg/

也是评论家之一指出,它允许你设置的基点条目上的伪寄存器之一点你的EXE:

bp $exentry 

bu @$exentry 
+0

我想你是按问题回答,但我不确定我是否解释了真正的问题。当我第一次打开WinDBG中的可执行文件时,Disassembly窗口会显示来自ntdll(我认为)的内容,而不是来自我的应用程序。我想看看我的模块的程序集,这就是为什么我想要打破我的模块的第一部分。问题是找到第一个保证执行(并触发中断)。 – cfinley

+0

您可以在加载您的应用程序后附加,然后搜索模块的入口点,如我建议使用'x myDLL!*'应列出所有内容,如果插入了DllMain方法,可以设置断点,另一种可能是使用依赖关系walker列出应按地址顺序列出的入口点 – EdChum

+0

是的,如果我做了'x/A Win32FileOpen!*',我请参阅“000e13a0 Win32FileOpen!main() 000e1000 Win32FileOpen!_enc $ textbss $ end = <无类型信息> 000d1000 Win32FileOpen!_enc $ textbss $ begin = <无类型信息>”,并且可以推断出我需要从main ()。但是,正如我在问题中提到的,当我没有符号时,我需要能够做到这一点。 – cfinley