在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