在Qt中设置断点后,gdb说:“访问内存地址时出错”

时间:2009-05-26 21:18:01

标签: debugging qt qt4 gdb breakpoints

我在这里写了一个非常简单的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.

有谁知道无法插入断点的原因?

4 个答案:

答案 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错误[?]