Debugging 用WINDBG调试VB6服务

Debugging 用WINDBG调试VB6服务,debugging,service,vb6,windbg,Debugging,Service,Vb6,Windbg,首先也是最重要的一点,我是调试编译代码的新手(直到最近,我才知道这是可能的!)。我已成功使用VC6 IDE连接到进程,但我无法使WinDbg正常工作 问题是我需要在生产服务器中调试一个VB6服务。我真的不太了解.EXE是如何编译的,因为它是由一个名为“NT服务工具包”的外部工具生成的。我的代码被编译成一个ActiveX DLL,该DLL由这个.EXE使用 我已经做了我在互联网上发现的一切,使服务可以用VC6IDE进行调试:无优化编译并生成符号。当我使用VC6 IDE连接到它时,它会按预期工作。。

首先也是最重要的一点,我是调试编译代码的新手(直到最近,我才知道这是可能的!)。我已成功使用VC6 IDE连接到进程,但我无法使WinDbg正常工作

问题是我需要在生产服务器中调试一个VB6服务。我真的不太了解.EXE是如何编译的,因为它是由一个名为“NT服务工具包”的外部工具生成的。我的代码被编译成一个ActiveX DLL,该DLL由这个.EXE使用

我已经做了我在互联网上发现的一切,使服务可以用VC6IDE进行调试:无优化编译并生成符号。当我使用VC6 IDE连接到它时,它会按预期工作。。。我可以设置断点,一切正常,除了调试会话停止时杀死服务的恼人bug

但是,当我尝试使用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
我已经从symbol服务器上下载了windows组件的symbol,正如我可以找到的文档中所指示的那样,我还将我的服务的PDB文件包含在symbols文件夹中

我注意到的一点是,在选择要附加到的进程时,当我选中“非侵入性”框时,我可以获得符号信息,因为我看到类似于
wow64win!ZwUserGetMessage
而不仅仅是地址`偏移量语法。。。但当我这么做的时候,我也得到了这样的警告:

WARNING: Process <PID> is not attached as a debuggee
     The process can be examined but debug events will not be received

更新


当我在“无创”模式下设置断点、分离并在未选中“无创”的情况下重新连接时,我在“无创”模式下设置的断点将保留并成功命中,但我无法设置新断点,除非我重复整个过程(分离、在“无创”模式下连接并重新连接)。这有意义吗?我可能做错了什么?

我发现了问题。模块名称中存在冲突

当WinDbg为进程加载模块时,它将它们命名为它们所在的文件,只是没有扩展名。因此,如果像我的情况一样,必须加载的两个模块共享相同的名称,例如
MyService.exe
MyService.dll
,那么将有两个模块名为MyService;在这种情况下,WinDbg通过在名称后面添加uu来消除歧义,例如:

...
MyService
MyService_11000000
...
(以下是对发生的事情的合理化,因为正如我所说,我对“附加到进程”类型的调试非常陌生,而且我缺乏WinDbg内部的知识…)

我的问题是DLL(MyService.PDB)的PDB文件(我对调试感兴趣的模块)与EXE文件的模块(MyService)匹配,因此在尝试“还原”断点之前没有加载DLL的符号,导致我前面看到的Win32错误0n299。。。似乎
g
命令也尝试“设置”保存的断点,并且由于符号尚未加载,因此也不允许我在默认断点之后启动该操作

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


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

输出显示您使用了64位Windbg版本。我相信VC6只能生成32位二进制文件,所以请检查进程的位数,如果是32位,请使用32位Windbg(x86)。您能否具体说明VB6(Visual Basic)或VC6(Visual C++)的情况?@KjellGunnar下载了x86版本,并试用了它。。。插入新断点仍然失败…@ThomasW。很抱歉。。。代码是用VB6编译的。我刚才提到VC6是因为它的IDE允许您连接到正在运行的进程,而VB6 IDE不。。。
...
MyService
MyService_11000000
...