2017-02-03 16 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; 
} 

名.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'に2つのフラグを追加します: '-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

関連する問題