我有一个C程序,它有一个动态分配的数组,它的基指针是一个全局变量。下面是一个简短的示例程序:
double *array = NULL;
void foo() { /* complex calculations on array */ }
void bar() { /* complex calculations on array */ }
int main() {
array = malloc( /* large size */ );
foo();
bar();
}
我必须用gcc -O2 -no-pie program.c -lm
编译它。我可以用objdump -D -S a.out
反汇编程序,找到array
的位置和各种具体指令。我想写一个脚本,在没有我干预的情况下完成以下所有操作:
1.在某种调试状态下运行程序,并等待到达特定的指令--我假设指令总是在特定的内存位置,因为我在编译时使用了-no-pie
。
1.遵循全局array
指针指向动态分配的内存-我再次假设-no-pie
将始终确保全局指针位于特定的内存位置。
1.从动态分配的内存中转储特定数量的字节到文件中。
我看了一下gdb,但是大多数教程都提到使用-g -Og
进行编译,我更愿意避免使用-g -Og
,而使用检查点的原始内存位置和array
的位置。使用gdb可以做到这一点吗?或者我必须使用其他工具?
更新:
我将使用一个架构模拟器来有意地在程序的各个点注入位翻转。我想确定位翻转是如何破坏程序数据的,特别是数组。我想知道数组在程序中不同点的值,以了解位翻转的效果如何传播。
我不能在源代码中的程序中间添加额外的打印函数,因为我正在测试的程序必须与一个一次完成整个计算而没有任何打印的程序相当。
1条答案
按热度按时间0md85ypi1#
用gdb可以吗
是的,广发行完全有能力做到这一点。
让我们从一个 * 实际 * 的工作示例开始:
用
gcc -O2 -fno-inline -no-pie t.c
编译它(使用-fno-inline
,因为否则foo()
会内联)。正如你所看到的,我们已经观察到了我们想要的所有值。
您可以将两个断点的地址和
array
的地址硬编码到脚本中(这里是gdb.script
):然后以
gdb -batch -x gdb.script ./a.out
的形式运行gdb,生成:唯一剩下的部分是“将字节转储到文件中”,这可以通过
dump memory
GDB命令来实现:P.S.你也可以通过将断点设置为
silent
模式来摆脱Breakpoint 1, 0x000000000040105c in main ()
输出,如下所示:输出变为: