如何使用Visual Studio调试进程?

5
如果一个应用程序崩溃,

enter image description here

我点击了“调试”按钮,Visual Studio是我当前注册的即时(JIT)调试器:

enter image description here

Visual Studio 出现了,但是无法进行调试:

enter image description here

  • 我没有看到任何反汇编代码
  • 我没有看到任何寄存器(假设它在运行有寄存器的CPU上)
  • 调用栈为空(假设该CPU有一个堆栈指针)
  • 我没有看到任何符号(假设它有)
  • 我没有从反射中看到重构的源代码(假设它是托管的)

其他JIT调试器产品能够显示反汇编代码,但它们要么是基于命令行的(Windows调试工具),要么不支持符号(OllyDbgDelphi)。此外,我的问题是关于使用Visual Studio进行调试,因为我已经安装了它,并且它已经是我的注册JIT。

如何使用Visual Studio调试程序?

或者:有人编写了一个支持Microsoft符号服务器的图形化调试器吗?

† 不一定要在Visual Studio中编写。

编辑:将标题更改为过程而不是应用程序,因为后者某种程度上暗示了“我的应用程序”。

编辑:假设原始应用程序是由Steve Gibson用汇编语言编写的。也就是说,没有源代码或调试信息。Visual Studio仍然应该能够向我显示汇编转储。


我不明白。这是你的程序吗?还是别人的? - GEOCHET
是的。对于两种情况都适用相同的问题。如果是我的应用程序,则我想调试可执行文件。如果是别人的,则我想调试可执行文件。 - Ian Boyd
如果这是你的,你会在 VS 中进行,然后按照我的回答执行步骤。如果不是你的,则可能非常受限制,如果没有包含调试符号。 - GEOCHET
@Rich B: 我不在VS里面,因为你看到的是Windows崩溃对话框,而不是VS捕获它。 - Ian Boyd
这是本地代码还是托管代码? - i_am_jorf
@jeffamaphone:我们能假设我不知道它是否被管理吗?如果我的电脑上的某个随机应用程序崩溃了,我并不特别知道它是否被管理。它也可能是本地的,然后在内部使用托管类来完成某些事情。或者它可能是一个调用本地代码的托管应用程序。无论哪种方式:进程是否被管理会改变如何调试崩溃的进程吗? - Ian Boyd
6个回答

3
看截图,Visual Studio目前处于运行模式下的调试状态 - 在查看诸如调用堆栈等信息之前,您需要终止进程的执行......

要中断进程的执行,您需要触发断点,或者您可以随时使用暂停/中断所有工具栏项(Control+Alt+Break)来中断进程的执行。

然后,您应该能够在“调试”->“窗口”菜单下访问以下窗口:

  • 反汇编窗口
  • 寄存器窗口
  • 调用堆栈窗口
  • 模块窗口显示已加载模块列表以及它们对应的符号从哪里加载(如果已加载)

一些其他有用的窗口:

  • 进程窗口在同时调试多个进程时非常有用
  • 线程窗口
  • 内存窗口(有四个)
  • 本地窗口

这些窗口中的一些可能默认情况下不可见,具体取决于您首次启动Visual Studio时选择的窗口配置 - 如果找不到它们,则右键单击工具栏并转到自定义以添加它们。

Visual Studio不会从反汇编中重构源代码 - 您确实需要有原始源代码可用,否则符号几乎肯定与您正在调试的源代码不匹配。

如果您在没有源代码的情况下调试非托管模块,则建议您至少尝试WinDbg - 其用户界面有时有点笨拙,并且它具有陡峭的学习曲线,但它是一个非常强大的调试器,支持许多Visual Studio不支持的功能 - 它可能更适合您需要执行的调试类型。

(Visual Studio是一个很棒的调试器,但它主要用于调试可用源代码的模块,因此它缺少某些功能,以换取更好的用户体验)。


2
假设这是您在VS中编写的应用程序,只需按F5运行程序,然后使用断点或手动中断程序来开始调试。

我该如何将可执行文件加载到Visual Studio中? - Ian Boyd
如果这是你的程序,你应该在VS中开发它。只需要按F5即可。如果不是这种情况,那么你需要在问题中提供更多的细节。 - GEOCHET
1
他并不是在编写应用程序,而是当他作为最终用户使用的程序崩溃(未处理的异常)时,他才会遇到这个问题。因此,他没有源代码。 - Jeff
今天编写的并非所有Win32可执行文件都是使用Visual Studio创建的。 - Ian Boyd

1
上一张截图中的问题是Visual Studio没有自动进入断点模式。这似乎是一个错误。如果您点击工具栏上的“暂停”按钮,它将进入断点模式,为您提供反汇编和调用堆栈。
根据最后一张截图,您实际上已经连接到了程序...输出窗口显示它加载了OLE和crt的剥离符号。

1

如果您的程序有可用的调试信息,您可以使用Visual Studio调试程序。这是编译发布版本(通常没有调试信息)和编译调试版本之间的区别。

如果您正在测试自己编写的程序的调试版本,则此对话框非常方便。您可以“即时”将其附加到Visual Studio调试器并查找问题。

如果不是您的程序或者是您的程序,但没有提供Visual Studio可以理解的调试信息,则您就没那么幸运了。


1

使用菜单调试->窗口->反汇编(我认为键盘快捷键是Alt+8, 但我的配置是 VC 6.0绑定, 因为这就是我的风格,可能已经改变了)。

您可以从http://msdl.microsoft.com/download/symbols获取操作系统的公共符号。将其添加到菜单工具->选项->调试->符号->符号文件位置列表中。

另外,请确保您以与应用程序相同的完整性级别运行。或者始终以管理员身份运行 Visual Studio。


0

我猜你已经在调试模式下了。"运行"按钮被禁用了。只需转到调试 -> 窗口 -> 反汇编以查看反汇编代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接