在我的visual c++代码中,我引入了__debugbreak语句来触发断点。我用/CLR选项编译了这个项目。但它不会在执行期间触发断点。为什么会发生这种情况?请帮帮我,免得我开枪自杀。这是一个64位的可执行文件。
编辑:我现在尝试了DebugBreak()语句,它现在永远挂起,不确定在哪个语句。dll由服务器程序使用,我从另一台机器上的客户端访问它。这是导致问题的原因吗?我应该从服务器机器本身运行它吗?我希望它至少报告一条关于断点被触发的消息,即使它不能在客户机上成功启动调试器会话。.pdb文件在服务器上与dll位于同一位置。
更新:我刚刚尝试在服务器机器上运行客户端程序,但DebugBreak()仍然导致无限挂起。调试器会话没有启动
为什么不能在调试器中使用F9(断点)?但是,DebugBreak();
应该可以工作。
如果DLL/EXE不能直接加载,您可以从"调试"菜单中选择"附加到进程"(希望您使用的是Visual Studio)
我在c#中使用这段代码,也许你可以把它改编成c++
#if DEBUG
var endTime = DateTime.Now.AddSeconds(30);
while (!System.Diagnostics.Debugger.IsAttached && DateTime.Now < endTime)
System.Threading.Thread.Sleep(10);
if (System.Diagnostics.Debugger.IsAttached)
{
System.Diagnostics.Debugger.Break();
}
#endif
虽然@user1772138的答案对于c#是正确的,但对于现代c++,更合适的解决方案是:
#if DEBUG && (__WIN32 || __WIN64)
#include <chrono>
#include <ctime>
#include <thread>
#include <windows.h>
#include <debugapi.h>
using namespace std::chrono_literals;
using std::chrono::system_clock;
#endif // DEBUG
然后,在main中:
int main(int argc, char *argv[]) {
#if DEBUG && (__WIN32 || __WIN64)
auto endTime = system_clock::now() + 30s;
while (!::IsDebuggerPresent() && system_clock::now() < endTime) {
std::this_thread::sleep_for(10s);
}
if (::IsDebuggerPresent()) {
__debugbreak();
}
#endif // DEBUG
// Main code goes here
即使__debugbreak
不工作——它相当于c# System.Diagnostics.Debugger.Break
——第一部分在程序开始前等待30秒,如果你在这个时候成功地连接了调试器,你不需要调用__debugbreak
。您只需在生成程序的程序中放置一个断点,然后当您到达该断点时,超越它,并在Visual Studio Debug中附加到进程-> attach to process…
编辑:添加了一个检查,以确保这是在Windows上运行;在Linux下,代码会有所不同,但op要求的是Windows解决方案。