2012-04-10 12 views
13

私は複雑なC++コードを持っています。「Stack smashing detected」をデバッグする方法は?

それは私がそう長いURLを使用することはありませんので、私はlooooong URLのためにそれを頼むとき、私は現実の生活のために

*** stack smashing detected ***: ./tileserve terminated 
Erreur de segmentation 

を取得http://althenia.net/fcgicc

を使用して、それは問題ではありません、FastCGIのプログラムですが、それは誰でも私のサーバーを終了することができることを意味....私はそれが好きではない。

どこに問題があるのか​​を知るためのツール(および使用方法)がありますか?

EDIT:

を解決してOKが解決しました。その200がlenテストのためにあまりにも絶頂だったように私は

int len; 
char uri[200]; 

len = strlen(request.params[std::string("REQUEST_URI")].c_str()); 
printf("%d\n", len); 

if (len > 200) return 1; 

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str()); 

をしていた

が見えます。 それは実際に194

で失敗したので、私がやった:

if (len > 190) return 1; 

は今、それは大丈夫です。

+2

スタックトレースによってヒントが得られます。 – Mahesh

+4

+1 'Erreur de segmentation'の場合 – trojanfoe

+0

スタックトレースとは何ですか? – user1219721

答えて

14

ウェブサイトを読んだら、これはCライブラリを使った単純なC++ラッパーであることに気づくでしょう。

Cライブラリで一般的な問題は、バッファオーバーランです:

#include <cstring> 
#include <cstdio> 

int main(int argc, char* argv[]) { 
    char buffer[16]; // ought to be sufficient 

    strcpy(buffer, argv[1]); 
    printf("%s", buffer); 
} 

は、このプログラム試してみてください:

> ./test "a" 
a 
> ./test "abcdefghijklmnoprqstuvwxyz" 
??? 

をバッファが16文字のみを含めることができるため、残りの文字が最後まで書き込まれます。これは、のスタックスラッシュであり、の未定義の動作です。

実行時ライブラリまたはOSのいくつかの実装では、状況によってはこの状況が検出され、プログラムが終了することがあります。

どちらかあなたが何か間違ったことやライブラリがあるを行っている

問題を見つけるには、Valgrindを使用するか、デバッガでプログラムを実行します。また、システムで許可されている場合は、プログラムが強制終了された時点でメモリダンプが発生する可能性があります。デバッガでこのメモリダンプを表示することもできます。

+0

ええ、私は何が問題なのか理解しています。問題はそれを見つけることです... – user1219721

+0

@ user1219721:oups申し訳ありませんが、その部分を逃した。デバッガを使用します(LinuxではVC++またはgdbに統合されています)。 –

+0

Valgrindは、スタックベースのメモリエラーを検出しないためヒープメモリの破損のみを検出するため、ここでは役に立たない。 –

0

valgrindのようなものを使用することができます。また、コンパイラーは、バッファオーバーランの可能性がある場所を見つける静的分析を行うことができます。

また、strcpyのようなエラーが起こりやすい関数の使用を監査し、strncpyのような安全な関数で置き換えることもできます。std :: stringのような独自のメモリを管理するオブジェクトを使用することもできます。

関連する問題