【问题标题】:VB6 Service debugging with WINDBGVB6服务调试WINDBG
【发布时间】: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


【解决方案1】:

我发现了问题。这是模块名称的冲突。

当 WinDbg 为进程加载模块时,它会将它们命名为它们所在的文件,只是没有扩展名。因此,在我的例子中,如果两个必须加载的模块共享相同的名称,比如MyService.exeMyService.dll,就会有两个模块名为 MyService;在这种情况下,WinDbg 通过将 _start-address> 附加到名称来打破歧义,例如:

...
MyService
MyService_11000000
...

(以下是对所发生事情的合理解释,因为就像我说的,我对“附加到进程”类型的调试还很陌生,而且我缺乏对 WinDbg 内部结构的了解......)

我的问题是 DLL (MyService.pdb) 的 PDB 文件,这是我有兴趣调试的模块,正在与 EXE 文件的模块 (MyService) 匹配,因此在尝试之前未加载 DLL 的符号“恢复”断点,导致我之前看到的Win32 error 0n299...看来g 命令也尝试“设置”保存的断点,并且由于尚未加载符号,它不会让我在默认断点之后开始这件事......

...

或者类似的东西......显然,如果有人有更准确的解释,我非常希望得到启发。 :)

目前,我只是更改了服务 EXE 的名称,现在一切正常。

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多