我正在编写一个gdb脚本来分析核心文件。其目的如下:
1]我正在寻找分散在64Mb空间的数据包。该数据包具有4个字节的幻数。因此,我必须一次读取4个字节
2]我必须从给定的地址开始读取总共64Mb的数据
一旦我找到数据包,我应该打印数据包的详细信息并继续寻找其他数据包
4]因此在我的脚本中,主循环在最坏的情况下运行64 * 1024 * 1024/4 = 16777216次。
问题是什么:
脚本大约需要3个小时或更长时间,这是完全不切实际的
我假设这是因为它是一种解释语言,循环次数也很大
欢迎任何建议/改进。请帮助我。
答案 0 :(得分:2)
如果您认为问题是gdb速度慢,您可以使用“转储二进制内存”转储您感兴趣的内存区域,然后使用一个用您认为会更快分析转储的小程序。
答案 1 :(得分:2)
find命令应该做你想要的一切, 无需每4个字节左右循环, 它将最后找到的数据包的地址存储在$ _中 (未经测试,但应该是有效的)
(gdb) python x = list()
(gdb) set $start_addr = 0x....
(gdb) set $last_end = $start_addr
(gdb) set $_ = $start_addr+1
(gdb) while $_ != $last_end
>find $last_end, $start_addr + 64*1024*1024, 0x42
>set $last_end = $_
>python x.append(gdb.parse_and_eval("$_"))
>end
(gdb) python print map(lambda(y): str(y), x)
如果您没有python,可以使用set logging overwrite off,设置登录,打印,设置注销