2016-03-04 52 views
0

我正在嘗試檢查在我的服務器上「掛起」的進程。我使用gdb進行attatch的過程中,像這樣:GDB映射到PID - 無法訪問內存地址

gdb -p PID 

雖然GDB裏我跑bt,並得到如下:

(gdb) bt 
#0 0x00007f57f4be73ba in __getpwuid_r (uid=4113672712, resbuf=0x7f57f531ce40, buffer=0x1 <error: Cannot access memory at address 0x1>, buflen=0, 
    result=0x7f57f531a048) at ../nss/getXXbyYY_r.c:198 
#1 0x00007f5700000004 in ??() 
#2 0x0000000000000060 in ??() 
#3 0x0000000000000001 in ??() 
#4 0x00007f5700000031 in ??() 
#5 0x0000000000000000 in ??() 

是對Cannot Access Memory Address會出現這種進程掛起一個潛在的原因是什麼?或者是否意味着軟件已經退出,但仍然有一個正在運行的進程?

這是一個CasperJS腳本btw。

+0

聽起來就像您附加到應用程序的生產版本。這些可能會啓用優化並刪除調試符號。所以你不能完全依靠gdb告訴你的。例如,啓用優化功能後,某些變量值在任何給定時間都不可用於gdb。所以我的建議是將上面的信息保存爲數據點。但是不要僅僅依靠那些人得出確切的結論。不幸的是,你需要進一步調試。 – kaylum

回答

0

無法訪問內存地址是導致此過程掛起的潛在原因嗎?

這可能是因爲你的整個堆棧是假的,你的過程是不是裏面__getpwuid_r可言號。

發生這種情況的一種方法是更新系統庫,但尚未重新啓動該過程。然後,GDB將查看當前安裝的系統庫,這些庫與過程實際使用的副本不匹配。

您可以通過查找/proc/$PID/maps中的「(刪除)」條目來證明這一點。

如果確實如此,那麼您必須安排GDB在獲取正確的堆棧跟蹤之前查看系統庫的舊版本(在啓動過程時最新的版本)。 This answer可能有助於設置。

相關問題