我有一個叫做parser我用-g標志編譯的程式,這是我的 makefile
parser: header.h parser.c
gcc -g header.h parser.c -o parser
clean:
rm -f parser a.out
一個函式的代碼parser.c是
int _find(char *html , struct html_tag **obj)
{
char temp[strlen("<end") 1];
memcpy(temp,"<end",strlen("<end") 1);
...
...
.
return 0;
}
當我除錯決議器或其他東西時我喜歡看到什么,我還可以在點擊斷點后和n通過上述函式的代碼時更改代碼行。如果它不是那么的作業,gdb那么是否有任何開源解決方案來實際更改代碼并可能保存,所以當我運行代碼中的下一個陳述句時,然后在執行 n 之前更改的陳述句(possible different index of array)將執行,是否有任何開源工具或可以在 gdb 中完成我需要做一些編譯選項嗎?
我知道我可以在運行時在 gdb 中為變數賦值,但是是這樣嗎?有沒有什么東西像實際上也能夠改變酸
uj5u.com熱心網友回復:
大多數 C 實作都是編譯的。源代碼被分析并翻譯成處理器指令。這種轉換將難以分段進行。也就是說,如果源代碼有一些小的變化,實際上不可能更新可執行檔案來表示這些變化。作為翻譯的一部分,編譯器轉換和交織陳述句,分配處理器暫存器以用于計算運算式的一部分,指定記憶體中的位置來保存資料等等。當源代碼稍有更改時,這可能會導致新編譯發生在一個地方使用不同的暫存器或在特定函式中需要更多或更少的記憶體,從而導致資料來回移動。將這些更改合并到正在運行的程式中需要弄清楚所有差異,移動記憶體中的東西,重新排列處理器暫存器中的內容,等等。出于實際目的,這些更改是不可能的。
GDB 不支持這一點。
(Apple 的開發者工具可能有一些這樣的功能。我看到它針對 Swift 編程語言進行了演示,但沒有使用過。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/344219.html
