2017-02-03 2 views
0

Я пытаюсь сделать что-то довольно простое, но не понимаю, почему я получаю сообщение об ошибке. У меня есть Makefile, который я включу, чтобы вы могли видеть, что происходит. Но когда я перехожу через программу, я получаю libc-start.c: No such file or directory. Есть ли способ справиться с этим в Makefile или избежать этого?Отладчик gdb, доступ к файлам, которые не найдены

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>, 
[email protected]=true) at exit.c:35 
35 in exit.c 
(gdb) 
+0

Добавьте два флага в 'CFLAGS' и' CXXFLAGS': '-g3 -O0'. '-g3' будет содержать символические определения, а' -O0' может помочь с ''. Также см. [Компиляция с параметром -g, но «Одиночный шаг до выхода из функции main, которая не имеет информации о номере линии»] (http://stackoverflow.com/q/20474668/608639). В цитируемом вопросе говорится обновить GDB. Вы недавно запустили apt-get update && apt-get dist-upgrade? – jww

+0

Должен ли я добавлять эти флаги в Makefile? И да, я все обновил. – developerME

ответ

3

Но когда я шагаю через программу я получаю libc-start.c: No such file or directory не

Существует нет актуальных проблем здесь (и GDB, безусловно не неудачу) ,

Что происходит, что вы шаг мимо конца вашей программы, и в libc (который компилируется с отладочной информацией, но вы не установили источники для этого).

Многие программисты считают, что выполнение их программы начинается с main и заканчивается, когда возвращается main. Но на самом деле есть 1000 команд, которые запускают до и послеmain, так как libc подготавливает вашу программу к выполнению, а затем очищает после нее. Если вы не являетесь разработчиком libc, обычно, вы не заботитесь о них до и после шагов и не должны пытаться выполнить этот код.

+0

Вы правы. Gdb не терпит неудачу. Прошу прощения за вводящий в заблуждение титул. Я исправил эту ошибку. Спасибо за ваш вклад. – developerME

+0

В случае использования переполнения буфера, как я могу найти адрес libc, если я получаю эту ошибку? – Jeff

Смежные вопросы