7

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

4 回答 4

12

不要使用 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.

然后让你的断点发生。

确保在要设置断点的函数中指定参数列表,没有这些参数的名称,只是它们的类型。

于 2009-05-26T21:31:07.557 回答
4

实际错误:

访问内存地址 0x5fc660 时出错:输入/输出错误。

可能是由 32/64 位混淆引起的。例如,检查您没有附加到具有 64 位进程 ID 的 32 位二进制文​​件,反之亦然。

于 2010-09-09T01:33:32.190 回答
2

如果您想在不设置断点的情况下自动中断 main,您也可以使用该start命令。
如果您需要为程序提供任何参数,您可以使用:
start argument1 argument2

于 2009-05-28T20:57:20.670 回答
2

对我来说好吧,我在使用 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>

20 次中有 19 次消息,尽管有时它确实有效(很少)。

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

于 2015-08-26T18:10:35.170 回答