我还没有找到我要找的东西,所以我会自己提出问题.

考虑一下下面的C程序

char heap[<some-static-size>];

void main() {
  <this-code-reads-and-writes-to-heap>
}

我想在初始化heap之后,在gdb中执行这个程序.一种可能性是,我将数组的内容放在一个文件中,然后以某种方式将其提供给GDB.我怎么才能最容易做到这一点呢?一旦main完成,我想读取heap的内容并将其写入其他文件.

推荐答案

这里可以使用gdb dump and restore命令.将断点设置在mainexit.使用&heap[0]作为起始地址.

$ cat heap.c
char heap[100];

int main() {
    heap[0]++;
}
$ dd if=/dev/random of=input.bin count=1 ibs=100
1+0 records in
0+1 records out
100 bytes copied, 0.000306025 s, 327 kB/s
$ gdb -q heap
(gdb) b main
(gdb) commands
>restore input.bin binary &heap[0]
>continue
>end
(gdb) b exit
(gdb) commands
>dump binary memory output.bin &heap[0] &heap[100]
>continue
>end
(gdb) run
Breakpoint 1, main () at heap.c:4
4       heap[0]++;
Restoring binary file input.bin into memory (0x555555558040 to 0x5555555580a4)
Breakpoint 2, __GI__exit (status=0) at ../sysdeps/unix/sysv/linux/_exit.c:140
[Inferior 1 (process 9802) exited normally]
(gdb) q
$ cmp -l input.bin output.bin
  1  52  53

C++相关问答推荐

如何避免使用相对路径包含在c中

为什么可以通过指向常量int的指针间接地改变整数的值?

如何在Visual Studio代码中关闭此函数名称显示功能?

如何使用低级C++写出数值

如何在C中通过套接字自定义数据类型读取原始变量?

双指针指向常量双指针的指针类型赋值不兼容

为什么我会收到释放后堆使用错误?

如何使用libgpio(d)为Raspberry Pi编译C程序?

我在C程序的Flex/Bison中遇到语法错误

错误:字符串在C中获得意外输出

如何使用空元素块声明指针数组

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

C23标准是否向后兼容?

STM32 FATFS用户手册(Um1721)中的代码正确吗?

如何使crc32的结果与cksum匹配?

无法将字符串文字分配给 C 中的字符数组

模仿 memmove 的行为

为什么写入关闭管道会返回成功

在C中定义函数指针?

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?