我在这里写了一个非常简单的Qt程序:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QTableView table(&frame);
table.resize(100, 100);
table.show();
return app.exec();
}
当我尝试设置点击表的断点时,我从gdb中收到此错误:
(gdb) symbol-file /usr/lib/libQtGui.so.4.4.3.debug
Load new symbol table from "/usr/lib/libQtGui.so.4.4.3.debug"? (y or n) y
Reading symbols from /usr/lib/libQtGui.so.4.4.3.debug...done.
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)'
Breakpoint 1 at 0x5fc660: file .moc/release-shared/moc_qabstractitemview.cpp, line 313.
(gdb) run
Starting program: ./qt-test
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x5fc660: Input/output error.
有谁知道无法插入断点的原因?
答案 0 :(得分:11)
请勿使用gdb命令 symbol-file
加载外部符号。断点地址是错误的,因为它们没有重新定位。
相反,在main
中放置一个断点,运行程序,然后设置断点:
gdb ./program
GNU gdb 6.8-debian blah blah blah
(gdb) br main
Breakpoint 1 at 0x80489c1
(gdb) run
Starting program: ./program
Breakpoint 1, 0x080489c1 in main ()
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)'
Breakpoint 2 at 0xb7d24664
(gdb) continue
Continuing.
然后让你的断点发生。
确保在要设置断点的函数中指定参数列表,而不指定这些参数的名称,只需指定它们的类型。
答案 1 :(得分:4)
实际错误:
访问内存地址0x5fc660时出错:输入/输出错误。
可能由32/64位压缩引起。例如,检查您是否未附加到具有64位进程ID的32位二进制文件,反之亦然。
答案 2 :(得分:2)
如果你想在没有设置断点的情况下自动中断main,你也可以使用start
命令
如果您需要为程序提供任何参数,您可以使用:
start argument1 argument2
答案 3 :(得分:1)
好的,我在使用mingw-w64(本机或交叉编译器)构建时得到了这个。 我不确定究竟是什么问题,但如果我使用gcc mingw-w64 i686-5.1.0-posix-sjlj-rt_v4-rev0构建它,那么它会创建(最终)可调试构建。否则
(gdb) break main
...
(gdb) r
...
Cannot insert breakpoint 1.
Cannot access memory at address 0x42445c
<process basically hangs>
消息19次中有20次,但有时确实有效(很少)。
gdb 7.8.1和7.9.1似乎能够调试创建的exe。所以它可能不是gdb的版本有所作为。
我目前的理论/嫌疑人要么是gcc的版本,要么是编译器的sljl与dwarf2“方面”[?](i686-492-posix-dwarf-rt_v3-rev1不起作用,用某种形式的gcc 4.9.2交叉编译也没有)。没有尝试其他版本的gcc。
更新:更新的gcc(5.1.0)但是交叉编译我仍然遇到了这个失败。 这个案例中的原因结果是我的构建(FFmpeg)通过链接(在这种情况下是libgme)使用的依赖库,它导出了一些错误的“共享”符号(当我是构建静态可执行文件)。因此,“共享”构建了制动器(https://trac.ffmpeg.org/ticket/282)并且不知何故它也搞砸了gdb。例如,可能链接到SDL也可以这样做。我的想法可能是ld
错误[?]