2010-09-29 92 views
5

我可以将Visual Studio调试器设置为在创建线程时中断吗?在Visual Studio调试器中创建线程时出现中断

(请注意,这是不一样的突破上下文切换上在此的其他问题问:Can I set a breakpoint in Visual Studio (c++) to break on a thread context switch?

+0

你有没有想过这个? – 2013-02-19 01:07:54

+0

@Derek Tomes:我没有。我现在不用Windows或Visual Studio,所以我不再自己寻找解决方案。 – pauldoo 2013-03-04 18:17:16

回答

2

是,调试器获取的通知吧。不,用户界面不允许你告诉它打破该通知。如果这是托管代码,那么您可以使用MDbg示例并对其进行修改。

0

您可以在第一次拨打CreateThread时设置一个断点(也许您为此插入虚假呼叫)。 点击后,从源代码视图更改为反汇编视图并进入调用。通过ImportLib-Code并设置一个断点。不完美,但它的工作原理。

3

如果您知道该线程正在由托管的Thread类创建,那么一个简单的解决方案就是在其条目上放置一个断点(通过转到Breakpoints窗口,单击New-> Break at function并标记Thread。开始)。否则,正如汉斯所说,你将不得不使用像mdbg这样更复杂的解决方案,或者使用CLR事件探查器的开源实现(如SAE)并在ICorProfilerCallback中放入“asm int 3”指令ThreadCreated方法。另外,如果你有VS2010旗舰版,你可以在Intellitrace事件中查找线程创建的事件,并且可能从那里获得你需要的信息(尽管当线程被创建时这不会中断,而是给你回顾一下关于它创建时的堆栈跟踪/变量值的一些信息)。

+1

一个相关的提示是进入断点工具窗口(Ctrl + Alt + B),点击添加断点并键入Foo.Foo(其中Foo是类的名称,如Thread或BackgroundWorker),它将在所有构造函数中放置断点富。 – 2010-12-27 14:07:52

+0

刚开始我的应用程序时,刚刚为'Thread.Start'添加了一个断点,VS抓住了它。然后,我无法恢复,每次点击VS2010时,它都会告诉我它正在等待一个进程。要指出的是,不要在应用程序启动之前添加断点。 – teynon 2013-08-15 18:12:48

5

我找到了一种方法来做到这一点。虽然谷歌搜索我看到了相反的问题: Is it possible to break on thread exit with specific error code?

我把一个断点在函数RtlExitUserThread,在那之后我意识到,所有的线程与功能RtlUserThreadStart创造,所以把另一个断点该功能,这一切:)

0

至少有2分潜在的东西,当你说你要在线程创建打破你可能意味着:

创建线程内
  1. 打破新的线程之前已创建
  2. 在调用用户提供的函数之前,在新线程内部断开。

对于第一个选项,您需要打破CreateThread,_beginthread或_beginthreadex。

对于第二种选择,您需要在RtlUserThreadStart或BaseThreadInitThunk中分解,以在调用用户代码之前尽早捕获新线程。

不幸的是,如果你用上面列出的函数名创建一个断点,至少在默认情况下,Visual Studio不会中断这些函数。问题在于,对于本机调试,默认情况下它不会加载DLL导出,如果没有这种情况,调试器不知道在哪里查找上面提供的名称。

在开始调试之前,在Visual Studio中转到工具,选项,调试,然后展开左窗格中的调试选项树。然后点击“本机”并选中“加载DLL导出”。然后你可以再次开始调试你的可执行文件

之后,您应该能够通过输入名称在我提到的任何函数上创建断点。您可能会或可能不会需要通过名称创建断点是指定的DLL中的函数如下:

{,, kernel32.dll中} CreateThread的

{,, NTDLL。

https://blogs.msdn.microsoft.com/reiley/2011/07/26/debugging-tips-for-multi-threaded-application/

,并做一些EXPE:DLL} RtlUserThreadStart

我被从这里开始,得到这个信息我自己开玩笑。我知道这是对一个老问题的回应,但我希望这可以节省其他人在尝试调试线程启动时立即发生的崩溃时所遇到的一些痛苦。

相关问题