2011-06-04 86 views
0

我有一個數組,我不斷修改。在我的程序完成後執行我的修改並不完全符合我希望他們做的事情,所以我的數組並沒有變成我想要的方式。我有一個讀取數組內容的函數。有沒有辦法使用gdb並在某處放置斷點,然後運行讀取數組內容的函數?我想找出問題出在哪裏。 Gdb不讓我運行「p readArray()」。 f我有一個斷點。如何在斷點處運行gdb中的程序函數?

回答

0

這聽起來像你想要的是在陣列上設置手錶。語法是watch <expression> - 參考this question瞭解有關使用動態數組的手錶的更多信息(它是C++,但在C中應該相同)。

+0

嗯..有無論如何使用該功能?它以更有組織的方式打印出信息。 – hut123 2011-06-04 05:11:19

6

使用「命令」在命中特定斷點時運行命令。例如,對第一個斷點運行命令:

 
(gdb) commands 1 
Type commands for when breakpoint 1 is hit, one per line. 
End with a line saying just "end". 
> call readArray() 
> end 

您可以使用「信息斷裂」,以確定您所感興趣的斷點數量

+0

你的GDB fu明顯比我的好。我建議的「髒」​​解決方案適用於無法調用任意函數的調試器,但我想這在這種情況下是不相關的。 – Clifford 2011-06-04 06:46:41

0

設置breakboint地址。在malloc或靜態創建數組的地方獲取數組的地址,並在地址處設置斷點。

休息*地址

0

A「髒」的方法「於addr設置斷點」是修改程序計數器寄存器到一個位置的地址,你的代碼中顯示功能調用。確保在調用之後設置斷點,以便您可以將程序計數器恢復爲其原始值,如果您希望代碼在此後繼續正確運行。

即使更髒,如果函數不帶參數,也是將程序計數器設置爲函數中第一條指令的地址。在這種情況下,在return語句中放置一個斷點並在那裏恢復程序計數器,否則返回將返回到第一個斷點函數的調用者,這可能不是您想要的。這就是說,調試器完全能夠通過「watch」顯示數組內容,所以除非內容需要特定的解釋來理解它,否則這肯定會是一個更好的方法嗎?

另一個非調試器解決方法是將數組實現爲內存映射文件或共享內存,然後使用單獨的進程映射和顯示相同的文件或內存。這種技術將是操作系統特定的。

相關問題