2012-11-16 475 views
9

有沒有辦法在GDB代碼的每一行設置斷點?很明顯,我不想爲每一行打b *addr,所以我想知道是否有快速的方法來做到這一點。在GDB的每一行設置斷點

編輯 請注意,我正在運行由其他人創建的二進制文件,我無法訪問源代碼。不幸的是,該二進制文件沒有用-g標誌編譯。因此,我不能單步執行代碼中的每一行。

進一步編輯 賈森指出的下面,您可以通過代碼確實足下,只要您使用sini,而不是隻是簡單s(步驟)或n(下一步)。但是,如果源代碼已使用-g編譯,但是它逐步執行源代碼行,而不是逐步執行每個彙編指令,例如nisi,但是在編譯時不使用-g 。

+0

你想在每一步做什麼?對於'列表':http://stackoverflow.com/questions/4362581/get-gdb-to-do-a-list-after-every-step –

回答

7

使用sistepi)指示步驟通過代碼。您可以使用ninexti)來跳過您不感興趣的庫函數。如果您不小心踩到其中一個,finish應該讓您回到原來的例程。在這個級別工作的人通常會設置gdb來顯示接下來要執行的幾條指令,例如, disp/3i $pc

+0

哇,這樣一個簡單的解決方案。我使用n和s,而不是ni或si。完美的作品。我很好奇GDB是如何解釋ni和n的。另外,disp/3i $ pc非常有幫助。 – smaccoun

+1

'next'使用調試信息中的源代碼行信息來確定源代碼行的地址範圍。第10行可能從0x100到0x116,所以調試器(在幕後),指令逐步執行每條指令,直到pc爲0x116。併發症包括步入另一個函數或離開當前函數(返回命令,longjmp,拋出的異常),在這種情況下,您想停止執行。當調試程序進入子程序調用時,它會在原始函數上設置一個斷點並繼續。幕後有很多事情要做。 'ni'是較低的水平。 –

1

難道你不能把斷點放在執行的第一行,然後遍歷每一行?這取決於你想通過在每一行上設置斷點來實現什麼。如果你想評估表達式,你可以通過遵循我的邏輯(通過每一行的步驟)來完成。

+0

好點。你是對的,但我忘了說我正在運行一個沒有用-g標誌編譯的二進制文件。我也無法訪問源代碼,因此我無法使用-g重新編譯。不幸的是,這並不能讓我一步到位。問題已被編輯爲清晰 – smaccoun