我在一個共享庫(.so)的函數中添加了兩個斷點並運行gdb 7.4
並將其附加到進程。GDB無法插入內部斷點
GDB斷點處,我跑n
幾個步驟,和gdb報告以下錯誤(與大膽文本):
(GDB)B [函數名]
斷點1在0xf1f28a49 :文件../../../../../[file name] .cpp,第167行。
0xf1f2dae5的斷點2:文件../../../../../ [文件名] .cpp,第60行。
警告:設置了多個斷點。
使用「刪除」命令刪除不需要的斷點。 (gdb)
繼續。
[新主題0xcaafab90(LWP 28480)]
[線程0xcaafab90(LWP 28480)退出]
[新主題0xcaafab90(LWP 29558)]
[新主題0xc8cb6b90(LWP 29980)]
[切換主題0xc8cb6b90(LWP 29980)]
斷點2,[函數名稱](ostr = ...,clientResponse = ...,httpProtocol = ...,> reqType = ...)在../../ ../../../[file name] .cpp:60
60 ../../../../../[file name] .cpp:沒有這樣的文件或目錄。
in ../../../../../[file name] .cpp
(gdb)ni
0xf1f2daed 60 in ../../../../../ [文件名]的.cpp
(GDB)N
斷點1,[函數名](OSTR = ...,clientResponse = ...,httpProtocol = ...,> closeConn = ...,asynchResponse = ...,reqType = ...)
at ../../../../../[file name] .cpp:167
167 in ../../../ ../../[file name] .cpp
(gdb)n
警告:
無法插入斷點0.
訪問內存地址0x36cc6dde時出錯:輸入/輸出錯誤。
0xf7082771 signgjmp()from /lib/libc.so。6
(GDB)
這是從/proc/[PID]/maps
輸出:
08048000-08146000 R-XP 00000000 08:03 293876
08146000-08150000 RW-P 000fe000 08: 03 293876
08150000-099c8000 rw-p 08150000 00:00 0
[堆]
c21f9000-c21fa000 --- p c21f9000 00:00 0
c21fa000-c29fa000 rwxp c21fa000 00:00 0
c29fa000-c29fb000 --- p c29fa000 00:00 0
......
f1e1b000-f1e24000 RW-P 00:00 f1e1b000 0
f1e24000-f2093000 R-XP 00000000 08 :03 295549
。所以
f2093000-f2094000 --- p 0026f000 08:03 295549
。所以
f2094000-f2098000 [R - p 0026f000 08:03 295549
。所以
f2098000-RW f209c000-p 00273000 08 :03 295549
.so
f209c000-f209d000 rw-p f209c000 00:00 0
我的問題是:
GDB未能插入內部斷點
ni
命令,但爲什麼它嘗試0xf1******
如果文本部分是訪問地址0x36cc6dde
這個地址不包含在?你可以看到地圖的輸出。更一般的問題,我被告知共享庫在
0x40000000
開始,但爲什麼這不是在我的環境?
共享庫編譯爲-fPIC
。我在上面的痕跡中隱藏了一些符號名稱。
超過0xc0000000的Mmm addresess通常是內核映射的地址。爲什麼你的進程在用戶空間中使用thiese地址? – MirkoBanchi 2012-03-06 20:12:08