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

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

ただいまの
回答率

90.48%

  • C

    3834questions

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

C言語 コアダンプ 解析

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 1,918

ikasoumen

score 92

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2016/04/15 14:36

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

    キャンセル

  • ikasoumen

    2016/04/17 21:26

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

    キャンセル

回答 3

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/17 21:35

    ありがとうございます。
    まず、singnal を見るんですね。
    どんなケースでどんなエラーが発生するのか学んでおきたいですね。

    静的解析ツールとはコンパイラのことですよね。

    文字リテラルをポインタに代入する場合、
    gccだと定数扱いですが、他のコンパイラだと定数でなかったりするらしいですね。

    キャンセル

  • 2016/04/18 09:15

    コンパイラと静的解析ツールは厳密に言うと役割が異なります。
    フリーの物もあれば、高額な製品もありますが、ツールにより、どのようなことができるかが異なります。

    >gccだと定数扱いですが、他のコンパイラだと定数でなかったりするらしいですね。

    前のgccバージョンだと、オプションでも挙動が変えられたかと思います。最近のは追っていませんが。

    キャンセル

  • 2016/04/18 12:14

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

    キャンセル

0

こんにちは。

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

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

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


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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/17 22:07

    ありがとうございます。
    未定義を意識するようにします。

    アドレスがどこに当たるのか確認とは、ソースを自分で追うことでしょうか?
    そのアドレスが静的領域、自動領域どちらに属しているか知ることできるのでしょうか?

    他の言語に慣れてしまっているので、しばらくconstでもつけて
    仕様を意識できるにします。

    キャンセル

  • 2016/04/17 22:33

    > アドレスがどこに当たるのか確認とは、ソースを自分で追うことでしょうか?

    ビルド時にmapファイルを出力するように指定しておき、そのmapファイルにリストされているアドレスと比較することでセグメントを特定できる筈です。
    たぶんセグメントの特定くらいならそれほど手間はかからないと思います。

    私自身は、呼び出し来歴が欲しく似た手順でできそうなのですが、こちらの場合はアドレスを探す作業が非常に手間がかかりそうで、実際にはやったことありません。
    デバッガで再現できれば、例外が起きた時点でブレークさせることができるので、その時の呼び出し来歴を見ることで多くの場合は対処できますから。

    プログラムに割り当てられる各種のメモリについて理解していれば、実はそれほど難解な話ではないのですが、メモリについての理解が難解なのですよ。C言語はその辺がモロ見えな言語なのです。

    キャンセル

  • 2016/04/18 12:18

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/17 21:39

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

    キャンセル

  • 2016/04/18 22:40

    原因究明にはある程度コツというかパターンがありますから、たしかに経験がモノを言う場面は多いでしょうね。

    また、(残念ながらgccにはないのですが)Clangという別のコンパイラにはAddressSanitizerやMemorySanitizer等をはじめとした「特定のバグ検出付きコンパイル機能」が存在します。この機能はを有効にしてコンパイルされたプログラムを実行すると、今回のようなバグを検出できる(可能性が)あります。

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    CSVファイル変換

    下記のCSVファイルをrubyを使って、 namae,sincho,taiju  shinsuke,180,90↲  sadao,165,58 kota,156,68

  • 解決済

    C言語で作った自作DLLの関数(文字列型の配列)をC#で呼ぶ場合2

    度々失礼いたします。 前回、C言語で作った自作DLLの関数をC#呼ぶ際に 文字列型の配列を引数にして、受け渡しをすることができた者です。 現状 文字列型の配列を自作

  • 解決済

    c言語 リスト構造の検索

    アドレス帳の検索機能だけのプログラムを作っています。 作りたいプログラムは、  1,検索したい人の名前を入力する  2,事前に登録された情報の中から部分一致検索する 

  • 解決済

    文字の挿入のしかた。

    #include <stdio.h> int main(void){ int index; char text[]="love"; char insert

  • 解決済

    ファイル名に使われていない数字までループ

    前回の質問で画像を保存できるようになったんですが、画像を上書きせずに、重複していたら、ユーザ名_連番.pngという風にやっていきたいとおもいまして、コードを書いてみました。 /

  • 解決済

    GoogleDriveでGASを使って一日前までのファイルを別フォルダに移動したい

     前提・実現したいこと NASからGoogleDriveに毎晩1時にファイルをバックアップしています。 2時くらいにデータのアップロードが終了します。 その後,GoogleDr

  • 解決済

    世代管理型バックアップスクリプトを実行したい

    世代管理型でバックアップを取りたい。 お世話になります。 データのバックアップで、 AサーバーからBサーバーへ 毎日一度だけバックアップをとるのに、 苦戦をしています。 Aサーバー

  • 解決済

    C言語 ポインタと配列

    C言語でポインタの勉強をしている者です。初心者です。 main文字列を二つ用意して自作関数に渡し、二つ目の文字列を一つ目にコピーし、mainで結果を確認する関数を作成したいです

同じタグがついた質問を見る

  • C

    3834questions

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