gdb调试器访问未找到的文件

时间:2017-02-03 00:24:33

标签: c++ linux makefile terminal gdb

我正在尝试做一些相当简单的事情,但不明白为什么我会收到错误。我有一个我将包含的Makefile,这样你就可以看到发生了什么。但是当我逐步完成程序时,我得到了libc-start.c: No such file or directory。有没有办法在Makefile中处理这个或避免这个?

生成文件

# makefile to build a program

# program depends on components: name and main 
myname:      main.o name.o 
    g++ -g -ggdb  main.o name.o -o myname

# name.cpp has it's own header file
name.o:        name.cpp name.h
    g++ -c -g -ggdb  name.cpp

# main.cpp also uses the header file name.h
main.o:        main.cpp name.h
    g++ -c -g -ggdb main.cpp

clean:
    /bin/rm -f myname *.o

的main.cpp

#include <iostream>
#include <string>
using namespace std;
#include "name.h"

int main () {
    name myName;

    myName.SetLast(LAST);
    myName.SetMiddle(MI);
    myName.SetFirst(FIRST);

    cout <<"My name is: ";
    myName.PrintFirst();
    myName.PrintMiddle();
    myName.PrintLast();

    return 0;
}

name.cpp

#include <iostream>
#include <string>
using namespace std;
#include "name.h"

void name::GetFirst(string str) {
    str=first;
}

void name::SetFirst(string str) {
    first=str;
}

void name::GetMiddle(string str) {
    str=middle;
}

void name::SetMiddle(string str) {
    middle=str;
}

void name::GetLast(string str) {
    str=last;
}

void name::SetLast(string str) {
    last=str;
}

void name::PrintLast() {
    cout << last << "\n";
}
void name::PrintMiddle() {
    cout << middle;
}
void name::PrintFirst() {
    cout << first;
}

name.h

#define LAST    "Tank-Engine"
#define MI  "T. "
#define FIRST   "Thomas "

class name {

    private:
    string first;
    string middle;
    string last;

    public:
    void SetFirst(string str);
    void GetFirst(string str);

    void SetMiddle(string str);
    void GetMiddle(string str);

    void SetLast(string str);
    void GetLast(string str);

    void PrintLast();
    void PrintMiddle();
    void PrintFirst();

};
单步执行时出现

gdb错误

name::PrintLast (this=0x7fffffffe4a0) at name.cpp:31
31      cout << last << "\n";
(gdb) s
My name is: Thomas T. Tank-Engine
32  }
(gdb) s
main () at main.cpp:18
18          return 0;
(gdb) s
name::~name (this=0x7fffffffe4a0, __in_chrg=<optimized out>) at name.h:5
5   class name {
(gdb) s
main () at main.cpp:19
19  }
(gdb) s
__libc_start_main (main=0x400b86 <main()>, argc=1, argv=0x7fffffffe5b8, init=<optimized out>, 
fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe5a8) at libc-start.c:323
323 libc-start.c: No such file or directory.
(gdb) s
__GI_exit (status=0) at exit.c:104
104 exit.c: No such file or directory.
(gdb) s
103 in exit.c
(gdb) s
104 in exit.c
(gdb) s
__run_exit_handlers (status=0, listp=0x7ffff78ae698 <__exit_funcs>, 
run_list_atexit=run_list_atexit@entry=true) at exit.c:35
35  in exit.c
(gdb) 

1 个答案:

答案 0 :(得分:4)

  

但是当我逐步完成程序时,我得到了libc-start.c: No such file or directory

这里有没有实际问题(并且GDB肯定失败)。

发生的事情是你走过程序的 end ,进入libc(使用调试信息编译,但你没有为它安装源代码) )。

许多程序员认为他们的程序执行以main开头,并在main返回时结束。但实际上有1000条指令在 main之前和之后运行,因为libc准备好您的程序执行,然后在它之后进行清理。除非您是libc开发人员,否则通常在步骤之前和之后都不关心这些,并且不应该尝试单步执行该代码。