即使文件有行,GDB仍会生成"文件中没有行xx"错误

Amu*_*umu 10 c++ gdb

这真的很烦人.我得到了几个文件,我不明白为什么.这是一个示例源代码.(请不要关心内容,只需复制并粘贴并在my_atoi函数中的某处设置断点,gdb将不允许设置断点).my_atoi使用十进制,八进制和十六进制数字,将一个C风格的字符串转换为一个数字的表示,并将这些字符串转换为整数(这只是为了练习.我不会使用它,所以不要担心) .为了正确测试它,请在命令行中输入参数.ie

./my_atoi 0x12
Run Code Online (Sandbox Code Playgroud)

这是编译命令:

g++ -g -o my_atoi my_atoi.cpp
Run Code Online (Sandbox Code Playgroud)

这是gdb命令:

gdb -r --annotate=3 my_atoi
Run Code Online (Sandbox Code Playgroud)

我启用了-r用于遇到类似错误的另一个文件,并且它已修复(我不明白为什么).但是,不是这种情况.我通过emacs运行gdb.我不认为这是问题所在.

这是源代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 5

这是我在几周内听说过的这个(或类似)错误的第二个案例,在第一个案例中,升级到 7.3(最新版本)也修复了它。您应该向分发您版本 gdb 的任何人提交错误报告。

您可以通过以下方式解决此问题:

(gdb) maint info symtabs my_atoi.cpp
(gdb) maint info psymtabs my_atoi.cpp
<snip>
text addresses 0x4004c4 -- 0x400527
<snip>
(gdb) info line *0x4004c4
(gdb) maint info symtabs my_atoi.cpp
Run Code Online (Sandbox Code Playgroud)

在我第一次看到时,最终的 maint info symtabs 命令将显示 symtabs。现在可以获得行号信息。