我正在执行我的a.out文件.执行后程序运行一段时间然后退出并显示以下消息:
**** stack smashing detected ***: ./a.out terminated*
*======= Backtrace: =========*
*/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*
Run Code Online (Sandbox Code Playgroud)
可能的原因是什么?如何纠正?
(gdb) n
134 a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
(gdb) n
(gdb) p a
$30 = <value optimized out>
(gdb) p b
$31 = <value optimized out>
(gdb) p c
$32 = 3735928563
Run Code Online (Sandbox Code Playgroud)
gdb如何优化我的价值?
Chrome源代码调试包含用于单步执行,步入和退出的按钮.没有时间倒退,看看以前的功能是什么.
我正在使用gdb来调试C++程序.
我有这个代码:
int x = floor(sqrt(3));
Run Code Online (Sandbox Code Playgroud)
我想查看x的值.但是,gdb声称x是"<optimized_out>".如何查看x的值?我应该更改编译器标志吗?
我正在尝试调试很少有死锁的自定义线程池实现.所以我不能使用像gdb这样的调试器,因为我在遇到死锁之前点击了100次"启动"调试器.
目前,我在shell脚本的无限循环中运行线程池测试,但这意味着我看不到变量等等.我正在尝试std::cout
数据,但这会减慢线程并减少死锁的风险,这意味着我可以在获取消息之前等待1小时的无限.然后我没有得到错误,我需要更多的消息,这意味着再等一个小时......
如何有效地调试程序,以便它一遍又一遍地重启直到它死锁?(或者我应该用所有代码打开另一个问题以获得一些帮助?)
先感谢您 !
奖金问题:如何检查一切顺利std::condition_variable
?您无法确定哪个线程处于睡眠状态,或者条件是否出现竞争wait
条件.
有没有人真正使用过可逆调试器?谷歌出现的唯一产品是UndoDB.它显然仅适用于Linux.
我开始尝试使用gdb 7进行反向调试,按照教程:
http://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial
Run Code Online (Sandbox Code Playgroud)
我想,太好了!
然后我开始调试一个真正的程序,最后给出一个错误.所以我用gdb运行它,并在我认为错误出现的地方之前放置一个断点.然后我键入"record"以开始记录操作以便将来进行反向调试.但经过一些步骤,我得到了
Process record doesn't support instruction 0xf0d at address 0x2aaaab4c4b4e.
Process record: failed to record execution log.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00002aaaab4c4b4e in memcpy () from /lib64/libc.so.6
(gdb) n
Single stepping until exit from function memcpy,
which has no line number information.
Process record doesn't support instruction 0xf0d at address 0x2aaaab4c4b4e.
Process record: failed to record execution log.
Program received signal SIGABRT, Aborted.
0x00002aaaab4c4b4e in memcpy () from /lib64/libc.so.6
Run Code Online (Sandbox Code Playgroud)
在我详细介绍之前,我想知道这个功能是否还有错误,或者我是否应该从头开始录制.
发生此"记录"错误的地方,只创建一个对象作为其他对象的副本.
我正在玩gdb反向调试.所以我有一个简单的C程序,main()和foo()在main()中调用.
在gdb里面,我做了以下几点
b main
record
run
Run Code Online (Sandbox Code Playgroud)
然后我介入foo()
:
s
Run Code Online (Sandbox Code Playgroud)
然后我试着回去
reverse-step
Run Code Online (Sandbox Code Playgroud)
那是我在标题中收到错误消息的时候.
我的gdb版本是:GNU gdb(GDB)7.5.91.20130417-cvs-ubuntu
我做错了什么?
在这里我想问这个问题。当我调试程序时,有时我希望能够再次运行之前的指令。就像在 Microsoft Visual Studio 中一样,我们可以将位置指示器(记住黄色箭头)拖动到您要查找的上一条指令。
例如:
我的程序当前位于第 72 行,假设第 70 行与第 72 行所在的函数相同。现在我想再次重新运行第 70 行。有什么办法可以做到这一点吗?
谢谢。