在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调试GUI程序
- 4. 如何使用GDB调试OpenCV程序?
- 5. 如何让GDB调试链接程序
- 6. 如何用gdb调试多线程/进程应用程序?
- 7. 如何直接在gdb中运行程序集?
- 8. gdb调试UDI程序
- 9. GDB汇编程序调试
- 10. 使用GDB调试iOS应用程序
- 11. 如何使用GDB调试多线程?
- 12. 如何用gdb中的信号处理程序调试C程序?
- 13. 如何使用GDB输出C +程序集跟踪?
- 14. 使用gdb调试chroot程序
- 15. 使用gdb调试C程序
- 16. gdb问题中的C程序调试
- 17. 如何从x86_64程序集调用sprintf?
- 18. 确定如何调用程序集
- 19. 如何调试一个程序,从用户输入stdin与GDB?
- 20. 如何调试(GDB)64位应用程序的32位部分?
- 21. 如何使用GDB调试加载程序/链接器问题
- 22. 如何使用GDB调试
- 23. 在程序集中识别库调用
- 24. 在GCC中调用程序集?
- 25. 在qemu中使用gdb调试引导程序
- 26. 在gdb中调试应用程序输出问题
- 27. 使用GDB调试Fortran中的MPI程序(在MAC上)
- 28. Emacs gdb - 调试程序集时显示箭头
- 29. 了解gdb生成的程序集
- 30. 如何在SQL中调用标准的.NET程序集
如何修改寄存器,如果'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