__debugbreak语句不触发断点



在我的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解决方案。

最新更新