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

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

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

Кто-нибудь еще испытывает такую ​​ошибку? Каков наилучший способ исправить это? Построить glibc из источника? (Я уже запускаю версию GDB, построенную из исходного кода)
6
задан 18 February 2011 в 22:31

16 ответов

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

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

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

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

5
ответ дан 25 May 2018 в 22:55
  • 1
    Когда strlen стал встроенным в gdb? И почему это происходит только в системах Debian / Ubuntu? – alesplin 19 February 2011 в 02:39
  • 2
    @alesplin это встроенный в gcc, а не gdb. – psusi 19 February 2011 в 07:34
  • 3
    Правильно. Я беспокоился там минуту. Проблема заключается в других библиотечных функциях (или «встроенных») при вызове непосредственно из GDB. Я полагаюсь на это довольно сильно, но поскольку у меня появился новый рабочий компьютер под управлением Ubuntu, я не могу использовать strlen, strcmp и т. Д., Потому что они сломаны. Ваше предложение объявить указатель на функцию strlen действительно сработало, но для нашей среды это не реально. – alesplin 19 February 2011 в 09:00
  • 4
    @alesplin builtin означает, что он встроен в компилятор, а не библиотечную функцию. Встраиваются только определенные функции библиотеки. Это означает, что компилятор напрямую генерирует код для их реализации в том месте, где они используются, вместо того, чтобы вызывать фактическую библиотечную функцию. – psusi 20 February 2011 в 04:12
  • 5
    Это еще более проблематично, так как другие функции, объявленные gcc-документацией, являются встроенными (atoi, isdigit, isupper) работают должным образом. Так что, если это не libc, и все встроенные модули не сломаны, значит ли это, что Ubuntu отправляет неуклюжие gcc? Я пробовал это с помощью gdb (7.2) Ubuntu и моего собственного (6.7.1, построенного из источника). – alesplin 20 February 2011 в 09:56

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

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

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

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

5
ответ дан 25 July 2018 в 22:27

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

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

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

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

5
ответ дан 2 August 2018 в 03:54

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

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

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

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

5
ответ дан 4 August 2018 в 19:58

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

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

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

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

5
ответ дан 6 August 2018 в 04:00

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

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

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

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

5
ответ дан 7 August 2018 в 21:58

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

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

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

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

5
ответ дан 10 August 2018 в 10:12

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

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

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

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

5
ответ дан 13 August 2018 в 16:34
  • 1
    Когда strlen стал встроенным в gdb? И почему это происходит только в системах Debian / Ubuntu? – alesplin 19 February 2011 в 02:39
  • 2
    @alesplin это встроенный в gcc, а не gdb. – psusi 19 February 2011 в 07:34
  • 3
    Правильно. Я беспокоился там минуту. Проблема заключается в других библиотечных функциях (или «встроенных») при вызове непосредственно из GDB. Я полагаюсь на это довольно сильно, но поскольку у меня появился новый рабочий компьютер под управлением Ubuntu, я не могу использовать strlen, strcmp и т. Д., Потому что они сломаны. Ваше предложение объявить указатель на функцию strlen действительно сработало, но для нашей среды это не реально. – alesplin 19 February 2011 в 09:00
  • 4
    @alesplin builtin означает, что он встроен в компилятор, а не библиотечную функцию. Встраиваются только определенные функции библиотеки. Это означает, что компилятор напрямую генерирует код для их реализации в том месте, где они используются, вместо того, чтобы вызывать фактическую библиотечную функцию. – psusi 20 February 2011 в 04:12
  • 5
    Это еще более проблематично, так как другие функции, объявленные gcc-документацией, являются встроенными (atoi, isdigit, isupper) работают должным образом. Так что, если это не libc, и все встроенные модули не сломаны, значит ли это, что Ubuntu отправляет неуклюжие gcc? Я пробовал это с помощью gdb (7.2) Ubuntu и моего собственного (6.7.1, построенного из источника). – alesplin 20 February 2011 в 09:56

Это, вероятно, известная ошибка в eglibc. См. Http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 25 May 2018 в 22:55
  • 1
    Я видел это, и меня несколько беспокоит, что такая вопиющая проблема вверх по течению может оставаться нерешенной так долго. – alesplin 14 March 2011 в 22:47
  • 2
    OMG, до сих пор не решена. – karlphillip 1 April 2011 в 04:47

Это, вероятно, известная ошибка в eglibc. См. Http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 25 July 2018 в 22:27
  • 1
    Я видел это, и меня несколько беспокоит, что такая вопиющая проблема вверх по течению может оставаться нерешенной так долго. – alesplin 14 March 2011 в 22:47
  • 2
    OMG, до сих пор не решена. – karlphillip 1 April 2011 в 04:47

Это, вероятно, известная ошибка в eglibc. См. Http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 2 August 2018 в 03:54
  • 1
    Я видел это, и меня несколько беспокоит, что такая вопиющая проблема вверх по течению может оставаться нерешенной так долго. – alesplin 14 March 2011 в 22:47
  • 2
    OMG, до сих пор не решена. – karlphillip 1 April 2011 в 04:47

Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 4 August 2018 в 19:58

Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 6 August 2018 в 04:00

Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 7 August 2018 в 21:58

Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 10 August 2018 в 10:12

Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740

1
ответ дан 13 August 2018 в 16:34
  • 1
    Я видел это, и меня несколько беспокоит, что такая вопиющая проблема вверх по течению может оставаться нерешенной так долго. – alesplin 14 March 2011 в 22:47
  • 2
    OMG, до сих пор не решена. – karlphillip 1 April 2011 в 04:47

Другие вопросы по тегам:

Похожие вопросы: