Понимание этого ошибочного поведения в GDB - PullRequest
5 голосов
/ 27 сентября 2010

Рассмотрим следующий код:

#include <stdio.h>
#include <ctype.h>

char* Mstrupr(char* szCad); 

int main()
{
    char szCadena[] = "This string should print well.";
    printf("%s\n", Mstrupr(szCadena));
    printf("%s\n", Mstrupr("This string should fail."));
    return 0;
}

char* Mstrupr(char* szCad) 
{
    int i;
    for (i=0; szCad[i]; i++) 
        szCad[i] = toupper(szCad[i]);
    return szCad;
}

Второй вызов Mstrupr не выполняется правильно на linux, поскольку он получает строку в виде литерала (а не в виде массива char).Когда вся программа запускается на GDB, она также дает сбой, но когда точка останова добавляется к основному и программа запускается с помощью следующей команды GDB, вторая строка пишется с заглавной буквы и печатается. Почему? Я полагаю, что так не должно быть, но мой инструктор настаивает на том, что это часть дизайна GDB.

Ответы [ 2 ]

9 голосов
/ 27 сентября 2010

Я не вижу, что это часть дизайна GDB. Это похоже на случайный побочный эффект; GDB сделал сегмент кода доступным для записи, когда установил точку останова, поэтому теперь ваш код, который перезаписывает литералы, работает

Фактически, ни один разработчик отладчика не сделал бы намеренно свой отладчик, чтобы изменить поведение программы; что делает отладку действительно сложной

1 голос
/ 27 сентября 2010

Я должен указать, что я перекомпилировал и повторно отладил этот код с более новым GDB (GDB 7.1), и это поведение больше не появляется. Код кажется неисправным (ошибка сегментации при втором вызове функции), как и должно быть.

...