在 gdb 中调用 strlen 时返回不正确的值

在 gdb 中调用 strlen 时返回不正确的值

因此,我注意到 GDB 内部调用标准库函数时出现了一些严重错误的行为。我有以下程序来说明:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 

int main(int argc, char *argv[]) {
  char *s1 = "test";
  char *s2 = calloc(strlen("test")+1,sizeof(char));

  snprintf(s2,strlen("test")+1,"test");

  printf("string constant: %lu\n", strlen(s1));
  printf("allocated string: %lu\n", strlen(s2));

  free(s2);

  return 0;
}

从命令行运行时,该程序将输出您所期望的内容:

string constant: 4
allocated string: 4

然而,在 GDB 中,我从对 strlen() 的调用中得到以下不正确的输出:

(gdb) p strlen(s1)
$1 = -938856896
(gdb) p strlen(s2)
$2 = -938856896

我很确定这是 Ubuntu 附带的 glibc 的问题(我使用的是 10.10),但对于我们这些在 GDB 上花费大量时间的人来说,这是一个严重的问题。

  1. 还有其他人遇到过这种错误吗?

  2. 修复它的最佳方法是什么?从源代码构建 glibc?(我已经在运行从源代码构建的 GDB 版本)

答案1

该库运行良好。即使在 gdb 下运行,程序也会报告正确的值。错误似乎在于 gdb 评估表达式并强制目标程序调用该函数的方式。我在 10.04 上也看到了同样的行为。奇怪的是 p printf("foo\n") 正确地打印了 4。

看起来 gdb 有点困惑,因为 strlen 是内置函数。如果你这样做:

int (*len)(char *) = strlen;

然后让 gdb 打印 len("foo") 你就得到正确的结果。

答案2

这显然是 eglibc 中的一个已知错误。请参阅http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

答案3

更新得有点晚了,但是...

使用 printf 函数可以解决这个问题,例如,使用 p printf(var) 代替 p strlen(var),它将打印字符串 var 的长度

相关内容