在我的c ++程序中,我正在使用一个“发送”的库? Sigtrap对某些操作的时候 我正在调试它(使用gdb作为调试器)。然后我可以选择是继续还是停止程序。如果我选择继续该程序按预期工作,但在捕获Sigtrap后设置自定义断点会导致调试器/程序崩溃。
所以这是我的问题:
这是我昨天发布的问题的一般方法 Boost Filesystem: recursive_directory_iterator constructor causes SIGTRAPS and debug problems 我认为我的问题远非具体,我不希望你解决我的问题,但帮助我(希望其他人)了解背景。
非常感谢。
答案 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!");};