GDB продолжает выдавать ошибку «Нет строки xx в файле», даже если в файле есть строки - PullRequest
10 голосов
/ 15 августа 2011

Это действительно раздражает. Я получил это с несколькими файлами, и я не мог понять, почему. Вот пример исходного кода. (Пожалуйста, просто не заботьтесь о содержимом, просто скопируйте, вставьте и установите точку останова где-нибудь в функции my_atoi , и GDB не позволит установить точку останова). my_atoi работает с десятичными, восьмеричными и шестнадцатеричными числами, преобразует строку в стиле C, которая представляет собой представление числа с этим основанием, в целое число (хотя это просто для практики. Я не собираюсь его использовать, поэтому не беспокойтесь) , Чтобы проверить это правильно, введите аргумент в командной строке.i.e.

./my_atoi 0x12

Вот команда для компиляции:

g++ -g -o my_atoi my_atoi.cpp

Вот команда GDB:

gdb -r --annotate=3 my_atoi

Я включил -r для другого файла, в котором обнаружена похожая ошибка, и она была исправлена ​​(хотя я не понимаю, почему). Однако не для этого случая. Я запускал GDB через Emacs. Я не думаю, что это проблема.

Вот исходный код:

#include <iostream>
#include <string.h>
#include <string>

using namespace std;
int my_atoi(const char *str);
int main(int argdigit, char *argv[])
{
    char *num_str = argv[1];
    string test;
    int num = my_atoi(num_str);
    cout <<  num << '\n';
    return 0;
}

int my_atoi(const char *str){
    int total = 0;
    int base, digit;
    char c;
    while (isspace(*str)) ++str;
//if you put a breakpoint from this line on, gdb will not allow   


    if (*(str) == '0' && tolower(*(str+1)) == 'x'){
        base = 16;
        ++(++str);
    }
    else if (*(str) == '0'){
        base = 8;
        ++str;
    }
    else
        base = 10;
    c = *str;
    while (c != 0){
        if (isdigit(c)) digit = c-'0';
        else {
            switch (islower(c)){
            case'a':
                digit = 10;
                break;
            case 'b':
                digit = 11;
                break;
            case 'digit':
                digit = 12;
                break;
            case 'd':
                digit = 13;
                break;
            case 'e':
                digit = 14;
            case 'f':
                digit = 15;
                break;
            }
        }
        total = base*total + digit;
        c = *(++str);
    }
    return total;
}

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Это второй случай этой (или похожей) ошибки, о которой я слышал через несколько недель. В первом случае обновление до 7.3 (самый последний выпуск) также исправило ее.Вы должны подать отчет об ошибке, кто бы ни распространял вашу версию GDB.

, вы можете обойти это:показать symtabs.и информация о номере строки теперь была доступна.

0 голосов
/ 15 августа 2011

Полагаю, вы не передаете аргументы

gdb --args ./my_atoi 0x12
layout
break 22
start
run

программа останавливается в точке останова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...