什么导致调试会话中的Sigtrap

时间:2010-08-13 08:47:24

标签: c++ debugging gdb

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

所以这是我的问题:

  1. 是什么导致这样的Sigtrap?它是一个可以删除的剩余代码行,还是由调试器“找到他不喜欢的东西”引起的?
  2. 一般来说,sigtrap是一件坏事,如果是这样,为什么程序在编译Release而不是Debug版本时运行完美?
  3. Sigtrap表示什么?
  4. 这是我昨天发布的问题的一般方法 Boost Filesystem: recursive_directory_iterator constructor causes SIGTRAPS and debug problems 我认为我的问题远非具体,我不希望你解决我的问题,但帮助我(希望其他人)了解背景。

    非常感谢。

3 个答案:

答案 0 :(得分:37)

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

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

对于不支持断点或观察点的处理器,整个调试环境可能通过代码解释和内存仿真来完成,这种速度要慢得多。 (我想通过设置页面表标志来禁止读取或写入,无论哪个需要被捕获,让内核修复页面表,发出调试信号,然后再次限制页面标记,可以完成巧妙的技巧。这可能会支持附近 - 观察点和断点的任意数量,对于不经常访问观察点或断点的情况,运行速度稍慢。)

我在评论字段中提出的问题在这里看起来很合适,只是因为Windows实际上并没有发送SIGTRAP,而是以自己的本地方式发出断点信号。我假设在调试程序时,使用了系统库的调试版本,并确保内存访问看起来有意义。您的程序中可能存在一个在运行时粘贴的错误,但实际上可能会在其他地方造成进一步的问题。

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

答案 1 :(得分:2)

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

我已经将项目中的文件复制到VisualStudio中并解决了问题,然后将更改复制回eclipse和voila,就像一个魅力。原因就像使用reserve()和resize()函数的向量初始化差异,或尝试从向量数组的边界访问元素。

希望这会帮助别人。

答案 2 :(得分:2)

我收到了来自调试器的 SIGTRAP 并发现原因是缺少返回值。

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