我正在编写一个gdb脚本来分析核心文件。其目的如下:
1]我正在寻找分散在64Mb空间中的数据包。这个包有4个字节的幻数。因此,我必须一次读取4个字节。
2]我必须从给定的地址开始读取总共64Mb的数据。
3]一旦我找到包,我应该打印包的deatils,并继续寻找其他包。
4]因此,在我的脚本中,主循环在最坏的情况下运行64*1024*1024/4 =16777216次。
问题出在哪里:
脚本大约需要3个小时或更长时间,这是完全不切实际的。
我假设这是因为它是一种解释型语言,而且循环的数量也很大。
欢迎任何建议/改进。请帮帮我。
发布于 2011-08-18 06:13:53
如果您认为问题出在gdb速度太慢,您可以使用"dump binary memory“来转储您感兴趣的内存区域,然后使用一个您认为更快的小程序来分析转储。
发布于 2011-08-18 07:39:26
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、set logging、print、set logging off
https://stackoverflow.com/questions/7099874
复制相似问题