2009-05-26 33 views
5

我寫了一個非常簡單的Qt程序在這裏:設置Qt中斷點後,GDB說:「錯誤訪問內存地址」

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

我使用的是Ubuntu Intrepid,並且我已經安裝了libqt4-dbg,如果有幫助的話。 – Neil 2009-05-26 21:22:11

回答

2

如果您想在不設置斷點的情況下自動斷開主窗口,還可以使用start命令。
如果您需要提供任何參數的程序,你可以使用:
start argument1 argument2

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. 

然後讓你的斷點發生。

確保指定要設置一個斷點函數的參數列表,如果沒有這些參數的名稱,只是它們的類型。

+4

感謝pholklore在irc.freenode.net的#gdb中爲這個答案。 – Neil 2009-05-26 21:33:08

+0

你也可以只設置一個你喜歡的斷點而不必先斷開main(),並且gdb會詢問你是否要設置一個掛起的斷點。 但是,通過這種方式,您永遠無法確定該功能是否實際存在,或者是否發生了拼寫錯誤。所以答案中說明的方法更安全。 – Neil 2009-05-26 21:38:28

4

實際的錯誤:

Error accessing memory address 0x5fc660: Input/output error.

可以通過32/64位mixups引起的。例如,檢查是否沒有使用64位進程ID附加到32位二進制文​​件,反之亦然。

1

OK我,我使用MinGW-W64(本機或交叉編譯器)時,建立了這一點。 我不知道確切的問題是什麼,但如果我用它建造的mingw的gcc-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的錯誤[?]