GDB查找内存中非完整子字符串失败的原因及解决方法
问题原因
GDB的find命令对双引号包裹的字符串搜索模式,默认会自动在你输入的字符串末尾追加一个\0字节,作为匹配内容的一部分。
你代码中定义的XXXVAL宏对应的字符串常量,在内存中的实际存储序列是:H e l l o ! \n \0,十六进制为0x48 0x65 0x6c 0x6c 0x6f 0x21 0x0a 0x00。
- 当你执行
find 0x564d89488000, 0x7ffdae11c000, "Hello!\n"时,GDB实际匹配的序列是Hello!\n\0,和内存中存储的完整字符串完全一致,因此可以成功找到。 - 当你执行
find 0x564d89488000, 0x7ffdae11c000, "Hello!"时,GDB实际匹配的序列是Hello!\0,但内存中!字符后面紧跟的是\n(0x0a)而不是\0,因此匹配失败,提示找不到。
解决方法
如果需要匹配不需要末尾\0的子字符串,可以用以下两种方案:
- 方案1:使用字节序列搜索代替字符串搜索,直接传入子串每个字符对应的十六进制值,GDB不会自动追加额外字节。例如要搜索
Hello!,可执行命令:find 0x564d89488000, 0x7ffdae11c000, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x21 - 方案2:给
find命令指定匹配长度参数,强制只匹配输入字符串的前N个字节,忽略自动追加的\0。例如要搜索长度为6的Hello!,可执行命令:
其中find /s 6 0x564d89488000, 0x7ffdae11c000, "Hello!"/s指定搜索单位为字节,后面的数字6是你需要匹配的子串长度。
内容的提问来源于stack exchange,提问作者d0zz0r
相关产品推荐
相关产品推荐

