strlen возвращает неправильное значение при вызове в gdb

6

Итак, я замечаю какое-то строго неправильное поведение от вызовов стандартных библиотечных функций внутри 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)
 = -938856896
(gdb) p strlen(s2)
 = -938856896

Я уверен, что это проблема с glibc, поставляемым с Ubuntu (я использую 10.10), но это серьезная проблема для тех из нас, кто много времени проводит в GDB.

  1. Кто-нибудь еще испытывает такую ​​ошибку?

  2. Как лучше всего это исправить? Построить glibc из источника? (Я уже запускаю версию GDB, построенную из исходного кода)

задан alesplin 18.02.2011 в 19:31
источник

2 ответа

5

Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \ n") правильно печатает 4.

Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:

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

И затем gdb print len ​​("foo") вы получите правильный результат.

    
ответ дан psusi 18.02.2011 в 20:40
источник
1

Это, по-видимому, известная ошибка в eglibc. См. Ссылка

    
ответ дан jelmer 14.03.2011 в 02:53