初心者向けのCプログラムのデバッグ

...または「Hello world!」が落ちた場合の対処方法。



以下はすべて、主にLinuxおよびコンソールのデバッグ用に書かれていますが、他の条件でも使用できます。



これは奇妙に聞こえるかもしれませんが、バージョン管理システム(まだインストールされていない場合)をインストールしてリポジトリを作成することで、Porggramの作成を開始する必要があります。 これは、執筆プロセス中に、作家がどこで、何を、どのように、いつ、なぜ修正したかを思い出そうとして時間を無駄にしないために必要です。 現在、最も人気のあるのはsvn(subversion)、git、mercurialです。 後者は、個人的には、他人よりも好きです。なぜなら、主観的には、特に個人的な使用にとって、より簡単で便利だからです。



次に、gdb(デバッガー)およびstrace(システムコールモニター)コマンドがあることを確認する必要があります。 そうでない場合は、インストールします。 プログラムをコンパイルするときは、デバッグ情報の追加を有効にすることを忘れないでください。



だからそれが起こった-彼女は落ちた。 私が教えられた主なポイントの一つは、システム/プログラムが書いていることを注意深く読むことです。 次のコマンドを使用して、多くのことを学ぶことができます。





必要なものが何も見つからなかったとします。 次に、コマンド「ulimit -c 50000」、ulimit(シェルリソースの使用に関する制限を設定/表示する組み込みシェルコマンド。manまたはhereを使用して詳細な説明を読むことができます )、50000を実行する必要があります。ケースは、同じコンソールで実行されているプログラムのクラッシュ後に作成され、クラッシュしたプログラムのメモリダンプです。 次に、ulimitがあったコンソールでプログラムを再度実行します。 彼女は再び倒れますが、すでに樹皮の作成で(通常)。 または、これはすべて、次のように事前に実行できます。 エラーが浮かんでいる場合、2回目はすぐに落ちる可能性があり、時には何ヶ月も待っている人もいます。



デバッガの助けを借りて、暖かい樹皮を検討する必要があります。



gdbは、多くのことを実行できる対話型コンソールインターフェイスを提供しますが、ここではすべてを説明しません。マナとインターネットでは、多くの言語に対応しています。 今のところ、コールバックを表示する「バックトレースから」「bt」コマンドを実行するだけで十分です。メモリレコードがなかった場合(以下で検討します)、どこで壊れたかを確認できます。 また、「frame N」コマンド(Nは呼び出し番号(左側))を使用すると、詳細を確認できます。 コマンド「print <variable>」は、変数の値を確認するのに役立ちます(常にではありません)。 「Hello world!」がマルチスレッドの場合、すべてがより複雑になりますが、デバッガーの「thread N」コマンドを使用してN番目のスレッドのスタックに移動することができますが、原則として、これはあまり役に立ちません。



デバッガーがコールスタックに一連の質問のみを描画する場合、これは明示的なメモリレコードであり、それ(デバッガー)は役に立ちません。 ほとんどの場合、プログラムテキストを開いて、

同様のタイプの関数memcpy、memset、sprintfなどに特に注意を払い、配列を超えてメモリ内で行われるすべてのデータを書き込むことができるデータブロックを操作します。 ほとんどの場合、エラーはどこかにあります。 最低でも、たとえばsnprintfなど、より安全なもの(存在する場合)に置き換える必要があります。 これが役に立たなかった場合、古くから実績のある方法が戦いになります:



これは、シングルスレッドプログラムとマルチスレッドプログラムの両方に役立ちます(ここでは、いつものように、タンバリンとダンスすることができます)。



プログラムが無限ループに入り、システムがst迷に陥った場合(それは時々起こります)? ウィンドウマネージャーをアンロードし、スーパーユーザー(ルート)のコンソールの1つでテキストモードで実行します。 確かに、nice / reniceを使用して彼女の優先度をわずかに上げ、通常のユーザーとして別のコンソール/端末でプログラムを実行できます。 次に、ループで、スーパーユーザーコンソール(「kill」コマンド)で削除しても、彼女が書いたものを見ることができます。



何も役に立たない場合はどうしますか? ただ一つの答えがあります-じっと座って、慎重に、非常に慎重に、コードを勉強して考えることです。



プログラムにエラーがない場合(1001回目の外観と分析では表示されない)、セクションがスペースを使い果たした可能性がありますか? (実話)



最後に、皮質を別の場所(たとえば、自宅)に移動して決定する場合、それらのソースとコンパイルされたプログラムと共に、それらがどのように存在するか、gdbの出力が正しくないか、まったく存在しないことを追加します。



PS Linuxカーネルのソースコードでは、DocumentationディレクトリにCodingStyleファイルがあります。 初心者のCプログラマーにとって注意すべき点があります。



PPS最初にこれをすべて知っていれば、それは私にとってはるかに簡単です。




All Articles