在gdb中我可以使用call
來運行函數,但是如果我想運行一些額外的程序集呢?如何在gdb中調用程序集?
回答
之前GCC 5 (1),我不知道一種方式來運行任意機器碼,除非你真的輸入機器碼到內存,然後運行它。
如果你想在內存中運行的代碼是已經,你可以將指令指針設置爲開始,結束時斷點,然後去。然後,在斷點之後,將指令指針更改回其原始值。
但我實際上看不到這個用例。這並不意味着不是之一,只要你可以通過運行代碼來做任何事情,你也可以通過直接修改寄存器,標誌,內存等來實現。
例如,命令:
info registers
將轉儲寄存器的當前值,同時:
set $eax = 42
將eax
寄存器更改爲42
。
您也可以通過這種方式改變內存:
set *((char*)0xb7ffeca0) = 4
此寫入內存位置0xb7ffeca0
一個字節,你也可以使用同樣的方法來存儲更廣泛的數據類型。
(1) GCC 5允許編譯和與compile code
命令執行任意代碼,如記錄here。
的編譯代碼命令,近GDB引入,允許代碼編譯和注射,文檔:https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html
實施例:
int main() {
int i = 0;
printf("%d\n", i);
return 0;
}
然後在GDB:
start
next
compile code int j = 1; i = j; asm("nop");
continue
程序輸出:
1
爲此,您需要最近的GDB和GCC 5.x.測試上GDB 7.9.1,GCC 5.1,具有:
export LD_LIBRARY_PATH="/path/to/gcc/install/lib64:$LD_LIBRARY_PATH"
使得libcc1.so
將是可見的:這是一個最近GCC組分暴露一個C API到cc1
編譯器。
還有如我所料一樣return
,沒有工作的幾個結構,所以我問爲什麼在:In the GDB compile code command, what language constructs behave exactly as if they were present in the original source?
這似乎並沒有像'asm volatile (「mov $ abc,%eax」)',當語言是C.在'compile'命令返回後,'$ rax'仍然有它的原始值。當源語言爲asm時,GDB 7.10不支持'compile'命令,所以即使在調試用asm編寫的函數時也不起作用。 – 2016-02-17 04:42:09
@PeterCordes謝謝,我沒有嘗試過。 'compile'確實非常有限。但有潛力。 – 2016-02-17 10:22:30
對於C/C++來說,它看起來非常方便,但不適合僅僅試驗不同輸入的指令。我想你可以使用一個C變量作爲輸出操作數,但是你需要一條指令來使用它。在這一點上,將指令放在文件中,彙編/鏈接它,以及單步操作可能會更容易。感謝您指出,儘管這不是* this *問題的好答案。 >< – 2016-02-17 10:28:20
- 1. 如何在gdb中調用下一個程序集?
- 2. 如何讓GDB調試鏈接程序
- 3. 如何用gdb調試多線程/進程應用程序?
- 4. 如何直接在gdb中運行程序集?
- 5. 如何使用GDB調試多線程?
- 6. 如何用gdb中的信號處理程序調試C程序?
- 7. 如何使用GDB輸出C +程序集跟蹤?
- 8. gdb問題中的C程序調試
- 9. 如何從x86_64程序集調用sprintf?
- 10. 確定如何調用程序集
- 11. 如何調試(GDB)64位應用程序的32位部分?
- 12. 如何使用GDB調試
- 13. 在GCC中調用程序集?
- 14. 在gdb中調試應用程序輸出問題
- 15. 使用GDB調試Fortran中的MPI程序(在MAC上)
- 16. 如何在SQL中調用標準的.NET程序集
- 17. 如何在Windows的x86程序集中編寫系統調用?
- 18. 如何在XCode的調試器窗口中禁用程序集?
- 19. 如何在gdb中使用其他標誌運行程序?
- 20. 如何在GAC中引用程序集
- 21. 如何在使用GDB調試Rust程序時使用格式打印?
- 22. 用GDB調試編程調用函數
- 23. 如何在Eclipse CDT中的gdb中調用調試應用程序時查找共享庫?
- 24. GDB遠程調試
- 25. gdb步驟調試C程序
- 26. 調試程序(gdb)的塊輸出
- 27. 無源代碼調試程序(Unix/GDB)
- 28. GDB和NS2:如何在某些函數調用時停止程序
- 29. 如何使用Qt Creator中的GDB進行遠程調試?
- 30. 使用GDB遠程調試多線程C程序
如何修改寄存器,如果'mov'等不能直接運行? – gdb 2011-03-30 01:59:02
@gdb:例如,您可以使用'set $ eax = 42'。查看更新。 – paxdiablo 2011-03-30 02:13:11
你也可以演示如何用'set'來改變內存嗎? – gdb 2011-03-30 02:22:53