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

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

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

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

Q&A

解決済

3回答

6595閲覧

C言語 コアダンプ 解析

ikasoumen

総合スコア110

C

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

1グッド

2クリップ

投稿2016/04/15 03:54

###前提・実現したいこと
C言語でのコアダンプはどこまでエラーの情報がわかるのでしょうか?
解析方法について教えていただきたいです。

#経緯
文字列のコピーを試したところ、エラーが発生しました。
原因は、分かっていて、静的領域置いていた変数を書き換えようとしたことが原因でした。

char *s = "test1"; //NG char s[] = "test1"; //OK

それはいいのですが、コアダンプを見たところ、
問題発生個所の情報はわかりますが、
原因は静的領域を書き換えようとしたためという情報は分からないように思えました。
-コピー関数でのエラーだと分かるが、どの変数に起因しているかわかりにくい、
仕様を理解していないと原因が分からない。
-個人的にはconstをつけてないので書き換え禁止だという認識が全くなかった

ダンプの情報は、こういうものなのか、見方・使い方が間違っているのか、更に解析する方法があるのか
教えていただきたいです。

###発生している問題・エラーメッセージ

Program terminated with signal 11, Segmentation fault. #0 0x0000000000400618 in scpy1 (dest=0x400707 "test1", source=0x40070d "test2") at p-112.c:8 8 while(( dest[i] = source[i]) != '\0'){ Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.el7_2.4.x86_64

###該当のソースコード

while(( dest[i] = source[i]) != '\0')i++;

###補足情報(言語/FW/ツール等のバージョンなど)
gcc

mpyw👍を押しています

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

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

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

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

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

coco_bauer

2016/04/15 05:36

dest、sourceの初期設定に誤りがあったというだけの事なのではないのですか? 原因はエラーを起こした行ではなく、その前にあるはずなのに、そのコードを質問に書いていないところに思い違いがあるのではないでしょうか?
ikasoumen

2016/04/17 12:26

その通りですね。 しかし、言語理解が浅く原因特定に時間がかかるので、 コアダンプでどこまで原因の情報が読めるのか質問した次第です。
guest

回答3

0

C言語でのコアダンプはどこまでエラーの情報がわかるのでしょうか?
それはいいのですが、コアダンプを見たところ、問題発生個所の情報はわかりますが、
原因は静的領域を書き換えようとしたためという情報は分からないように思えました。

コアダンプ解析から直接読み取れるのは、「どこで問題が表面化したか」という情報のみです。その問題が何故発生したのか(根本原因)や、そこに至るまでに何が起きたのか(経緯)は、コアダンプに記録されているそのタイミングでの各種変数の値といった事実から、あなた自身が解析/逆推測していく必要があります。

Chironian さん回答にもある通り、特にC言語ではプログラムのバグ=コアダンプを吐く異常停止につながるとは限りません。バグがあっても大抵は問題が表面化しない(がデータを破壊するなど)ことや、実行環境の変化や試行回数により突然異常停止するようになることもあります。

投稿2016/04/16 06:39

yohhoy

総合スコア6189

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

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

ikasoumen

2016/04/17 12:39

コアダンプから推測して原因箇所を特定するには、経験が必要なんですね。 表面化しないメモリ破壊とか現状では、箇所を特定できる自信ないです。 Cは難しい。。
yohhoy

2016/04/18 13:40

原因究明にはある程度コツというかパターンがありますから、たしかに経験がモノを言う場面は多いでしょうね。 また、(残念ながらgccにはないのですが)Clangという別のコンパイラにはAddressSanitizerやMemorySanitizer等をはじめとした「特定のバグ検出付きコンパイル機能」が存在します。この機能はを有効にしてコンパイルされたプログラムを実行すると、今回のようなバグを検出できる(可能性が)あります。
guest

0

こんにちは。

原因は静的領域を書き換えようとしたためという情報は分からないように思えました。

-コピー関数でのエラーだと分かるが、どの変数に起因しているかわかりにくい、
仕様を理解していないと原因が分からない。
-個人的にはconstをつけてないので書き換え禁止だという認識が全くなかった

厳しいことを言いますが、正直な話コアダンプが出るだけラッキーなケースと思います。何もエラーが出ずに"test1"が"test2"に置き換わる処理系もあります。
以前、同僚がハマってました。

C

1char *s="test1"; 2printf("%s\n", s);

と書いているのに何故か"test2"と出力されるのです。
別の場所でstrcpy(s, "test2");とやってたのです。当時はエラーもコアダンプもでませんでした。

C言語は未定義が多く、しかも未定義については必ずしもエラーがでるとは限りません。
C言語の本質は「言語仕様を理解していないと痛い目にあうリスクがある」と思っていた方が良いです。あちこちに落とし穴が開いてます。

ダンプの情報は、こういうものなのか、見方・使い方が間違っているのか、更に解析する方法があるのか

教えていただきたいです。

コピー先のアドレスが表示されてます。そのアドレスがどこに当たるのか確認することで、それが書き換え不可セグメントに割り当てられていることは分かるだろうと思います。
すいません。私は実際にコアダンプを解析したことはないのでその具体的な方法は分かりません。

投稿2016/04/15 09:28

Chironian

総合スコア23272

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

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

ikasoumen

2016/04/17 13:07

ありがとうございます。 未定義を意識するようにします。 アドレスがどこに当たるのか確認とは、ソースを自分で追うことでしょうか? そのアドレスが静的領域、自動領域どちらに属しているか知ることできるのでしょうか? 他の言語に慣れてしまっているので、しばらくconstでもつけて 仕様を意識できるにします。
Chironian

2016/04/17 13:33

> アドレスがどこに当たるのか確認とは、ソースを自分で追うことでしょうか? ビルド時にmapファイルを出力するように指定しておき、そのmapファイルにリストされているアドレスと比較することでセグメントを特定できる筈です。 たぶんセグメントの特定くらいならそれほど手間はかからないと思います。 私自身は、呼び出し来歴が欲しく似た手順でできそうなのですが、こちらの場合はアドレスを探す作業が非常に手間がかかりそうで、実際にはやったことありません。 デバッガで再現できれば、例外が起きた時点でブレークさせることができるので、その時の呼び出し来歴を見ることで多くの場合は対処できますから。 プログラムに割り当てられる各種のメモリについて理解していれば、実はそれほど難解な話ではないのですが、メモリについての理解が難解なのですよ。C言語はその辺がモロ見えな言語なのです。
ikasoumen

2016/04/18 03:18

色々知らないことを教えていただきありがとうございます。 参考書読んでても、疑問ばっか沸いてきて全然前に進まないのですが、 のんびり進めていきたいと思います。
guest

0

ベストアンサー

デバッグという観点であれば、signal 11 なので、不正なメモリアクセスと判断して、そこから類推することになるとおもいます。
また、言語仕様の話なので、それを指摘することは実行時エラーので指摘する役割ではなく、静的解析ツールの役割ではないでしょうか。

投稿2016/04/15 04:21

t_obara

総合スコア5488

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

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

ikasoumen

2016/04/17 12:35

ありがとうございます。 まず、singnal を見るんですね。 どんなケースでどんなエラーが発生するのか学んでおきたいですね。 静的解析ツールとはコンパイラのことですよね。 文字リテラルをポインタに代入する場合、 gccだと定数扱いですが、他のコンパイラだと定数でなかったりするらしいですね。
t_obara

2016/04/18 00:15

コンパイラと静的解析ツールは厳密に言うと役割が異なります。 フリーの物もあれば、高額な製品もありますが、ツールにより、どのようなことができるかが異なります。 >gccだと定数扱いですが、他のコンパイラだと定数でなかったりするらしいですね。 前のgccバージョンだと、オプションでも挙動が変えられたかと思います。最近のは追っていませんが。
ikasoumen

2016/04/18 03:14

ありがとうございます。 ツールはgcc と vim(操作に慣れておきたいため) ぐらいしか使っていませんが、余裕があればツールも見てみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問