本质上,您是在问如何调试 DLL。OCX 只是一个加载到进程中的 DLL 文件。这是一个有点宽泛的话题,但我会尝试给出一个简短的开始:
DLL / EXE / OCX 文件在 Windows 编程环境中通常被称为“模块”。它们基本上都是一样的。为了清楚起见,我将在这里称它们为 DLL。
调试器(Visual Studio 和 Borland 既是调试器也是 IDE)像寄生虫一样“附加”到进程,允许您执行设置断点、读取进程内存、查看堆栈跟踪等操作。它们可以查看/操作所有内存和该进程的资源,包括所有 DLL。
DLL 不包含太多信息来帮助调试器,即使在调试版本中也是如此。它们基本上只包含二进制机器代码,如果您使用调试器进入 DLL 调用,您将只能看到汇编代码——而不是原始源代码。函数只是内存中的地址,局部变量甚至是不可见的;您只能获得一些指向堆栈内存的指针。
PDB 文件(“程序数据库”)包含所有附加信息和元数据,供调试器执行,例如将内存中的地址映射到源代码行、局部变量、数据类型、函数签名等。这些信息称为“调试符号”或只是“符号”。当 Visual Studio 构建一个 DLL 时,它会输出一个相应的 PDB 文件。正是这个 PDB 文件实现了在调试器中单步执行源代码、查看局部变量、在监视窗口中正确查看数据类型的所有魔力。
当 Visual Studio 的调试器附加到进程并看到正在加载的 DLL 时,它会搜索其对应的 PDB 文件。它在许多地方寻找这个 - 其中最简单的是在与 DLL 相同的文件夹中。所以如果你加载C:\something\myctl.ocx
了,它会寻找C:\something\myctl.pdb
. 如果它可以找到它,它将使用它,您可以使用丰富的调试器支持来调试 DLL。如果它找不到它,您将处于现在的位置 - DLL 调用是一个您无法看到的黑盒子。
微软甚至为 Windows DLL 提供 PDB 文件,例如ntdll.dll
. 必须根据需要下载它们。Visual Studio 可以通过转到自动执行此操作,Tools -> Options -> Debugging -> Symbols
并且应该有一个选项来使用 Microsoft 符号服务器自动获取丢失的符号文件。
让您朝着正确方向前进的小例子:
假设您编写了一个名为 OCX myctl.ocx
,当它添加到写字板文档时会崩溃。调试的方法是将调试器附加到wordpad.exe
. Debug -> Attach to Process
我相信在 Visual Studio 中。附加后,您甚至可以在输出窗口中看到:
'wordpad.exe': Loaded 'C:\Program Files\Windows NT\Accessories\wordpad.exe', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\ntdll.dll', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\kernel32.dll', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Symbols loaded (source information stripped).
...
您可以看到 Visual Studio 如何加载为这些文件提供一些额外信息的 PDB 文件(符号文件)。当您加载时myctl.ocx
,您也会看到该行。如果myctl.pdb
可以访问,它也会加载它。
'wordpad.exe': Loaded 'C:\something\myctl.ocx', Symbols loaded.
myctl.ocx
有了这个,您可以使用源代码和所有内容调试任何内容。当写字板在 中崩溃时myctl.ocx
,它应该向您显示源代码和所有内容,再次假设它位于可访问的位置。