質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6771閲覧

gdbで1行ずつ実行するとうまくいくが、通常の実行ではセグメンテーションフォールトする

kkkmokotan

総合スコア45

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/19 06:27

編集2017/05/19 06:28

C++にて開発しております。このたびプログラムにてセグメンテーションフォールトが起こってしまったため、原因をつきとめるためにgdbを用いてデバッグを行いました。しかし、gdbで各関数にstep実行しながら該当コードすべてを実行したところ、正常終了にコードの最後まで実行ができました。このようなことに考えられる原因はなんなのでしょうか?
実行環境はcentosの仮想マシン上です。

gdbを使って同じプログラムを実行した場合でも時々成功して、そのほかはセグメンテーション違反という感じになっています。

参考までにgdbの画面の画像をはります。
メモリのエラーのようで、該当の関数もわかっていますが、そこの部分だけテストしてもエラーが出ない。もしくは時々成功する意味がわからない。
という現状です。
GDBの画面
上ではrun が成功し、下では失敗しています。

エラーが出ている時のコードをのせます。エラーが出ているとしたらたまにこの関数の中で起こっているようです。

C++

1 typedef std::map<std::string, std::string> MAP; 2 3 MAP container; 4 5 template <typename T> bool getParam(std::string key, T* value) { 6 7 MAP::iterator p; 8 std::stringstream stream; 9 10 if ((p = container.find(key)) != container.end()) { 11 stream << p->second; 12 stream >> *value; 13 return true; 14 } 15 return false; 16 }

他にもなにか情報が必要であれば追記いたします。どうかよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2017/05/19 08:22 編集

"memory corruption”を検知しているので、バッファオーバーラン系のメモリ破壊が疑われます。ところで中途半端なマスキングには強い理由がありますか?特にbacktraceをマスクすると関数コールスタックがわからないため、解析に必要な情報が欠落しています。 → とりあえずValgrindやAddressSanitizerを試してみてはいかがでしょう。
guest

回答1

0

ベストアンサー

エラーの原因はmalloc(): memory corruption (fast):とあるようにメモリ破壊です。
そしてそれはstd::stringstreamの処理で起きています。

通常、デバッグでしか起きないバグの原因は「変数の未初期化」が大半です。
しかし、デバッグモードでも失敗したりしなかったりするのであれば、その線も薄そうですね。

1つ気になることがあります、このプログラムはマルチスレッドでしょうか?
例えばcontainerを複数のスレッドで同時に編集していませんか?
またgccの-pthreadオプションなどの設定はどうなっていますか?

投稿2017/05/25 09:49

編集2017/05/25 10:09
pashango2

総合スコア930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問