什么导致调试会话中出现Sigtrap 在我的C++程序中,我使用一个库,它将在某个操作时发送“SIGTRAP”。 我正在调试它(使用gdb作为调试器)。然后,我可以选择是继续还是停止该程序。如果选择继续,程序将按预期工作,但在捕获Sigtrap后设置自定义断点会导致调试器/程序崩溃

什么导致调试会话中出现Sigtrap 在我的C++程序中,我使用一个库,它将在某个操作时发送“SIGTRAP”。 我正在调试它(使用gdb作为调试器)。然后,我可以选择是继续还是停止该程序。如果选择继续,程序将按预期工作,但在捕获Sigtrap后设置自定义断点会导致调试器/程序崩溃,c++,debugging,gdb,C++,Debugging,Gdb,下面是我的问题: 是什么导致了这样的陷阱?这是一行可以删除的遗留代码,还是由调试器“发现他不喜欢的东西”引起的 一般来说,sigtrap是一件坏事吗?如果是这样,为什么当我编译一个发行版而不是调试版本时,程序运行得完美无缺 信号陷阱表示什么 这是我昨天发布的一个问题的更一般的解决方法。 我认为我的问题过于具体,我不想让你解决我的问题,而是想帮助我(希望其他人)了解背景 非常感谢。对于支持指令断点或数据监视点的处理器,调试器将要求CPU监视对特定地址的指令访问,或对特定地址的数据读取/写入,然后全

下面是我的问题:

  • 是什么导致了这样的陷阱?这是一行可以删除的遗留代码,还是由调试器“发现他不喜欢的东西”引起的
  • 一般来说,sigtrap是一件坏事吗?如果是这样,为什么当我编译一个发行版而不是调试版本时,程序运行得完美无缺
  • 信号陷阱表示什么
  • 这是我昨天发布的一个问题的更一般的解决方法。
    我认为我的问题过于具体,我不想让你解决我的问题,而是想帮助我(希望其他人)了解背景


    非常感谢。

    对于支持指令断点或数据监视点的处理器,调试器将要求CPU监视对特定地址的指令访问,或对特定地址的数据读取/写入,然后全速运行

    当处理器检测到该事件时,它将捕获到内核中,内核将向正在调试的进程发送SIGTRAP。通常,SIGTRAP会终止进程,但由于正在调试进程,调试器将收到信号通知并进行处理,主要是让您在继续执行之前检查进程的状态

    对于不支持断点或观察点的处理器,整个调试环境可能是通过代码解释和内存模拟来完成的,这要慢得多。(我想可以通过设置页表标志来禁止读取或写入(无论哪个需要捕获),然后让内核修复页表,向调试器发送信号,然后再次限制页标志来实现聪明的技巧。这可能支持接近任意数量的观察点和断点,并且只运行少量slower适用于不经常访问观察点或断点的情况。)

    我在comment字段中提出的问题在这里看起来恰到好处,只是因为Windows实际上并没有发送SIGTRAP,而是以其自身的方式发出断点信号。我假设在调试程序时,会使用系统库的调试版本,并确保内存访问看起来有意义。您的程序中可能有一个在运行时被掩盖的bug,但实际上可能会在其他地方引起进一步的问题


    我还没有在Windows上进行过开发,但也许您可以通过查看Windows事件日志获得更多详细信息?

    在Eclipse中使用minGW/gcc编译器时,我意识到它对代码中的向量的反应非常糟糕,导致SIGTRAP信号不清晰,有时甚至显示异常的调试器行为(即,在代码中跳到某个位置,并以相反的顺序继续执行代码!)

    我已经将项目中的文件复制到VisualStudio中并解决了问题,然后将更改复制回eclipse和voila,效果非常好。原因是与reserve()和resize()函数的向量初始化差异,或者尝试访问向量数组边界之外的元素


    希望这能帮助其他人。

    我从调试器收到一个SIGTRAP,发现原因是缺少返回值

            string getName() { printf("Name!");};
    

    这可能解释了无法解释的SIGTRAPs:这个线程中的信息看起来很有希望也要求静态DLL链接到程序。所以我认为我有问题,包括以错误的方式,或使用错误的DLL…首先:谢谢你的回复。它帮助我理解了Sigtraps背后的基本思想。我认为我的代码没有问题,不是因为我的代码写得很好,而是因为我可以触发呃,程序中的Sigtrap只包含一个对库的方法调用…(我假设boost库不太可能包含这样的缺陷)我将静态库链接到我的项目中的方式可能有问题