Итак, я замечаю какое-то строго неправильное поведение от вызовов стандартных библиотечных функций внутри 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, построенную из исходного кода)Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \ n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \ n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \ n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Библиотека работает нормально. Программа сообщает правильное значение даже при работе под gdb. Кажется, что ошибка связана с тем, что gdb оценивает выражение и заставляет целевую программу вызывать функцию. Я тоже вижу такое же поведение на 10.04. Странно p printf ("foo \n") корректно печатает 4.
Кажется, что gdb запутан, потому что strlen является встроенным. Если вы это сделаете:
int (* len) (char *) = strlen;
И затем получите gdb print len ("foo"), вы получите правильный результат.
Это, вероятно, известная ошибка в eglibc. См. Http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. Http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. Http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740
Это, вероятно, известная ошибка в eglibc. См. [D0] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594740