ID非公開

2020/9/19 9:55

33回答

【C言語】コアダンプの発生した場所が知りたい

【C言語】コアダンプの発生した場所が知りたい C言語初心者です。 最近C言語を実行すると、コンパイルは上手く行くのですが実行時に コアダンプ と表示されて異常終了してしまいます。 他のJava等の言語では java.lang.NullPointerException ~~~~~~~~(Sample.java:50) のように50行目に不具合があることがわかりますが、C言語では コアダンプ しか表示してくれません。そこでprintf("OK\n");を1行ごとずらして、OKが表示されなくなるまで続けています。 しかし、もっと楽な方法はあるのでしょうか?それとも、このprintf()をエラー箇所までずらしていくのか最善策なのでしょうか…

C言語関連20閲覧

ベストアンサー

0

コアをダンプしたら、それをデバッグコマンドで解析するのが普通です。 エラー箇所というなら、同じくデバッグコマンドでトレースして行くのが普通です。 メモリーオーバーフローやバッファーおオーバーランは printfで見つからないだけで無く、これを入れただけで動作が変わります。 これらは、静的解析ツールや動的解析ツールを使うのが普通ですが、使用料が年間1000万円くらいするので、小さい会社は無理でしょう。 無料の監視ライブラリーもあるのでリンクしておけば良いです。 速度が落ちますが解析可能です。 あとは、コーディング規則を決めて これらの事故が起きないように事前に防止するのが定石です。

デバッグコマンドは、プログラムを動かしながらprintfのように、指定した変数の中味の変化を確認できるツールです。変化をトリガーにして、プログラムを一時停止することもできます。 他にもICEを使う方法があります。これはでバグと言うよりもCPUのエラッタを見つけるような時に使います。

ThanksImg質問者からのお礼コメント

ありがとうございます。 C言語には実行時エラーの箇所を表示する機能が無く、デバッグコマンドで知る必要があるのですね。 そう考えるとJavaやPythonのような言語はとても良く出来ているのですね。 デバックコマンドについて調べようと思います。 ありがとうございました。

お礼日時:9/19 12:46

その他の回答(2件)

0

お使いのコンパイラやIDE依存・各論です。 C言語 の規格は故意にバイナリ領域は未規定。 ご質問の領域は、個々の処理系におまかせ の領域。 C言語 というだけで回答できるポータブルな汎用手段・方法は ありません。 例外や、例外発生時のstackTraceまで言語処理系の標準機能 として搭載されている言語とは事情がまったく異なります。 実際に使っている処理系がこれこれですと明示して質問し直せば、 なんらか回答は得られるんじゃないかしら。 たとえば、unix系OSで gcc なのであれば、デバッガ gdb で backtrace を調べれば.... といった具合。 Microsoft VisualStudioとかなら、また別手段があると思います。

0

初心者の範囲でやりがちなのは、配列の範囲を間違えたとか、ポインタの使い方を間違えたなので、 まずは、そこらがきちんとなっているか確認してみて下さい。 printfは1行ごとにやるのは流石に面倒なので、当たりをつけて各段階ごとにメッセージを変えて仕込んでおけば、 大雑把にどこまで進んだかを見る事ができます。 もしくは、Visual Studioを使っている場合は以下のページが参考になるかも知れません。 https://docs.microsoft.com/ja-jp/visualstudio/debugger/debugging-absolute-beginners?view=vs-2019