在Visual Studio中,有没有一种方法可以在下一行代码执行时中断?

35

我正在尝试追踪一个bug,当我点击aspx页面上特定的元素时会出现这个问题...

过去我一直需要追踪处理那个特定事件的类,并在我认为应该被命中的行上放置一个断点。通常情况下,在我最终找到正确的类之前,我需要多次尝试...尤其是如果这个类是 buried somewhere 的用户控件的话...

所以这让我想知道是否有任何方法能够让Visual Studio在我点击aspx页面上的元素(比如一个按钮)后,自动断在执行的下一行代码上。我知道有一种方法可以在任何抛出异常的地方停止,因此我想可能有类似的东西可以帮助我。

如果这种功能不可行,也许有人可以建议我更好的方法来快速找到我要调试的类...


这个“bug”是如何表现出来的?你不能在那里设置断点吗?或者你知道在你点击那个按钮设置断点后会执行任何其他代码吗?如果是这样,可以查看堆栈窗口。它应该会显示被调用的事件处理程序,然后你就可以在那里设置断点了。 - sbi
@sbi 当我点击一个展开显示更多信息的按钮时,这个bug就会出现,并且会显示比所需更多的数据。我一直试图找到对数据添加一些过滤器的方法。最终我成功找到了这个名字不好的委托方法。它是当一个datagrid项被访问时的委托方法。但我仍然希望能够更容易地找到它... - mezoid
@Kyralessa,你的评论真是毫无意义。也许你可以找到更好的方法来说服我重新考虑你的答案,而不是侮辱我... - mezoid
我可以向您保证,我并非拒绝了每一个答案……而只是接受了那个最接近满足我的需求的答案,即使它并不是理想的答案。就个人而言,我更喜欢您的答案,但它并没有为我工作,因此我无法接受它作为答案。 - mezoid
我猜问题在于尝试在ASPX页面上执行此操作。我现在也在MVC上遇到同样的问题。可能当您第一次单击按钮时,它会跳转到处理页面的脚本语言中。由于我们无法在那里设置断点,因此无法查看堆栈指针。 - Baz Guvenkaya
5个回答

33

你试过使用调试 > 中断所有 (“暂停”) 按钮了吗? (Ctrl+Break)

调试 > 中断所有

通常它会在栈的较低位置中断,比如在WinForms应用程序中你的主窗体的Show()方法处,但如果你接着点击“单步跟踪”按钮并跳过那一步,它通常会对此类事情起作用。


1
我不确定“全部中断”按钮是否完全符合我的要求,因为我认为代码将在我点击屏幕的毫秒内执行,因此我无法快速暂停它。 - mezoid
2
我再说一遍:你有尝试过吗?你不是在点击按钮后再试图点击"Break All"。你应该是先点击"Break All",然后点击"Step Into",最后再点击按钮。 - Ryan Lundy
4
这是个不错的答案,我认为并非“显而易见”。简单来说,在代码中加入Break All, F11 (一般在Application.Run 那行),然后点击表单上的按钮,代码就会在那个位置断开。这种方法不适用于某些情况,比如WndProc重写、消息泵等需要触发的情况。但对于其他情况,这样做很有效,也是一个简单的方法来说,“在我执行下一步操作时断点”(比如点击按钮!)。 - Matthew M.
2
更新:我提到,如果你正在做像覆盖WndProc、捕获键盘事件等操作,这种方法可能不太适用。解决方案是在你的方法上添加[DebuggerStepThrough]属性。这将绕过该方法并允许你在使用break-all和按F11后进入“下一个”方法,但会跳过任何其他你不想调试的方法。 - Matthew M.
我也很想弄清楚如何在执行下一行代码时中断它。我尝试了“中断所有”,但然后它说我需要禁用“仅限我的代码”。我想我以前做过这个,那真是噩梦。之后我完全不知道发生了什么事情,花了一段时间才把它恢复到正常状态。 - Travis Heeter
显示剩余4条评论

4
您是否在寻找“逐步进入(F11)”或“逐步跳过(F10)”? -- 编辑
您是否知道“调用堆栈(Call Stack)”窗口?它可以帮助您确定自己的位置和正在发生的事情。

抱歉,我知道F11、F10和调用堆栈窗口。我正在寻找的是一种方法,允许我在触发aspx页面上的动作后,一旦到达代码库就能够中断。 - mezoid
mezoid:也许你想在代码的特定部分编写 System.Diagnostics.Debugger.Break();?这将强制调试器在那里中断,而不管你是否明确设置了断点? - Noon Silk
除了我不知道需要在哪个类中放置break之外,其他都没问题... :( - mezoid
是的...好吧,恐怕这里没有什么能帮到你的,只能靠逻辑了 :) (好吧,也许这个链接可以:http://stackoverflow.com/questions/907856/computer-science-undergraduate-project-ideas/1346230#1346230),如果Mehrdad接受它作为一个项目 :P) - Noon Silk
好的,如果没有符合我要求的东西,那么我只能把答案授予给你,因为你告诉我这是不可能完成的。谢谢你的帮助! - mezoid
你不必给任何人答案奖励。只有在问题得到回答时才应该这样做。你似乎没有花太多的精力尝试给出的任何答案。这是你的选择,我想。 - Ryan Lundy

2

条件断点可能是您的答案。您可以在认为代码中断的位置设置它们,并且只有在满足条件时才会停止。


没错,但我想找到一种不需要设置大量断点来找到我要找的代码的方法。 - mezoid

0

调试 -> 异常

检查 CLR 异常的抛出。

编辑

很有可能是您遇到了 CLR 异常。使用此方法,当异常发生时,调试器将始终中断程序。与阅读堆栈跟踪相比,这非常方便。


那很好,但在我的情况下,我正在寻找的错误不是由异常引起的。 - mezoid

0
一些想法:
  • 如果您为事件处理程序使用一致的命名约定,则全局搜索所有处理程序并添加断点应该很容易。您可以在第一次命中时快速记录宏,然后播放宏以消除重复操作的痛苦。通过一些实践,您将能够在几秒钟内断点所有处理程序。

  • 为事件添加额外的事件处理程序(尽早创建它 - 例如在构造函数中 - 以便在应用程序添加的所有其他事件处理程序之前添加,因此希望首先调用),并在其中插入断点。一旦您命中断点,就可以逐个步骤地执行事件上的其他事件处理程序。

  • 编写一个自定义事件处理程序来处理单击并生成新事件。将所有其他事件处理程序附加到此次要事件。然后,您可以在第一个处理程序处设置断点,并逐个步骤地执行它调用的次要处理程序。


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