【发布时间】:2014-09-17 07:58:39
【问题描述】:
首先,我是调试编译代码的绝对新手(直到最近,我什至不知道这是可能的!)。我已成功使用 VC6 IDE 附加到进程,但无法让 WinDbg 工作...
问题是我有一个需要在生产服务器中调试的 VB6 服务。我真的不太了解 .EXE 是如何编译的,因为它是由一个名为“NT Service Toolkit”的外部工具生成的。我的代码被编译成这个.EXE 使用的ActiveX DLL。
我已经完成了我在 Internet 上找到的所有工作,以使服务可以使用 VC6 IDE 进行调试:无需优化即可编译并生成符号。当我使用 VC6 IDE 附加到它时,它按预期工作......我可以设置断点并且一切正常,除了在调试会话停止时杀死服务的烦人错误。
但是,当我尝试使用 WinDbg 时,我无法设置断点;它失败并出现错误:
Unable to insert breakpoint 0 at 00000000`0046f715, Win32 error 0n299
"Only part of a ReadProcessMemory or WriteProcessMemory request was completed."
bp0 at 00000000`0046f715 failed
WaitForEvent failed
我已经按照我可以找到的文档中的说明从符号服务器下载了 Windows 组件的符号,并且我还在符号文件夹中包含了我的服务的 PDB 文件...
我注意到的一件事是,当我在选择要附加到的进程时选中“非侵入性”框时,我可以获得符号信息,因为我看到像 wow64win!ZwUserGetMessage 这样的东西,而不仅仅是 address`offset 语法...但是当我这样做时,我也会收到以下警告:
WARNING: Process <PID> is not attached as a debuggee
The process can be examined but debug events will not be received
在这种情况下,我可以设置断点,但是当我尝试运行服务时,它会失败:
0:000> g
^ No runnable debuggees error in 'g'
更新
当我在“非侵入性”模式下设置断点,分离并重新附加且未选中“非侵入性”时,我在“非侵入性”模式下设置的断点仍然存在,并且成功命中,但我无法设置新的断点,除非我重复整个过程(分离,以“非侵入性”模式附加并重新附加)。这有意义吗?我可能做错了什么?
【问题讨论】:
-
输出显示您使用的是 64 位 Windbg 版本。我相信 VC6 只能产生 32 位二进制文件,所以检查你的进程的位数,如果是 32 位,请使用 32 位 Windbg(x86)。
-
能否具体谈谈 VB6 (Visual Basic) 或 VC6 (Visual C++)?
-
@KjellGunnar 下载了x86版本,试了一下。。。插入新断点还是失败。。。
-
@ThomasW。对不起...代码是用VB6编译的。我刚刚提到了 VC6,因为它的 IDE 允许您附加到正在运行的进程,而 VB6 IDE 没有...
标签: debugging service vb6 windbg