GDBデバッグの簡単な使い方

4113 ワード

長い間GDBを使わないで、ずっと書いていたのはクロスプラットフォームのもので、vsでデバッグしました.最近またlinuxに転送しました.その日にGDBを使わせて、拭いて、どうやって使うか忘れました.
まず第一のポイントを言います.GDBを使う前に、プログラムのコンパイルは-gオプションを加えると、GDBのデバッグに便利です.
一般的に小さいエラーは段のエラーです.つまりメモリのエラーです.このようなエラーは直接gdbを使ってプログラムを実行します.自分は段の間違ったところに止まってしまいます.
そして、btコマンドを使用して、スタックの場合、どの呼び出しに停止したかを確認し、フレームフレームをフレームフレームフレームフレームフレームフレームフレームに切り替えて、対応するスタック上の変数の値などを見てください.
test.cpp
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
using namespace std;
struct xx {
    int a;
    int b;
    int c;
};
int main(int argc, char *argv[])
{
    for (int i = 0; i < 5; i ++)
        xx *x = new xx;
    xx *p = (xx *)malloc(sizeof(xx));
    char *pp;
    int *parray = (int *)malloc(10 * sizeof(int));
    parray[9] = 1;
    pid_t pid = fork();
    int array[10];
    array[10] = 1;
    memcpy(pp, p, 10);
    return 0;
}
これは全部でたらめに書いたので、本来はvalgrindを学んで使ったのですが、今は1句加えて書いてみます.このコンパイルです.
g++test.cpp-Wall-g
そしてgdb./a.outを使って実行します.
gdbに入りました.
Traceback (most recent call last):
  File "<string>", line 35, in <module>
  File "/usr/local/share/gdb/python/gdb/__init__.py", line 19, in <module>
    import _gdb
ImportError: No module named _gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<>...
Reading symbols from /home/xx/test/a.out...done.
(gdb)
そして入力:r
運転すると間違えたところに直接止まってしまいます.下を見てください.
(gdb) r
Starting program: /home/xx/test/a.out 
Detaching after fork from child process 7034.
Program received signal SIGSEGV, Segmentation fault.
0x000000358648983e in memcpy () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.x86_64 libgcc-4.4.7-3.el6.x86_64 libstdc++-4.4.7-3.el6.x86_64
(gdb)
ここでSegmentation faultはセグメントエラーです.メモリの使用問題は主に次の文を見ます.
0 x 0000058648983 e in memcpy()from/lib 64/libc.so.6
この説明はmemcpyが間違っていますが、どれですか?
今btを打って、下を見ます.
(gdb) bt
#0  0x000000358648983e in memcpy () from /lib64/libc.so.6
#1  0x000000000040081a in main (argc=1, argv=0x7fffffffe208) at test.cpp:30
(gdb)
ここに表示されているのはメーン関数の中、つまりtest.cpp 30行目がmemcpyを呼び出しました.これで直接間違ったところに位置します.どう違うかを見てください.
frame 1を使用して、main関数のスタックに切り替えます.
(gdb) frame 1
#1  0x000000000040081a in main (argc=1, argv=0x7fffffffe208) at test.cpp:30
30     memcpy(pp, p, 10);
(gdb)
ここに来たら、彼らがmemcpyに伝えたパラメータは問題がありますか?
pを使って対応する変数の値を表示します.このpはコマンドです.memcpyの変数ではなく、変数名を後につけます.下を見てください.
(gdb) p pp
$1 = 0x0
(gdb) p p
$2 = (xx *) 0x1
(gdb)
ここで見ました.ppの値は0で、スペースを割り当てていないということです.無理に中に入れば、間違えます.
これを見たらコードを変えて、quitを実行してgdbを終了します.
(gdb) quit
A debugging session is active.
 Inferior 1 [process 7031] will be killed.
Quit anyway? (y or n) [answered Y; input not from terminal]
仕事が終わりました.もちろん一番簡単な使い方です.プログラムも一番簡単なプログラムです.深く使うにはもっと勉強しなければなりません.
例えば、マルチプロセス、マルチスレッドのデバッグなど、私はGDBマニュアルを作って公式サイトで、よく勉強しながら記録します.
これは公式サイトですhttp://www.sourceware.org/gdb/ このマニュアルと最新バージョンのgdbでいいです.
私は今すべてのファイルを保存しているところを軽蔑しています.ダウンロードしてもポイントが必要です.元の私の家のソフトウェアは無料で皆さんに使っています.中国語のマニュアルをもう一つポイントが必要です.
心から......コードといい、文書といい、ウェブサイトが多すぎて、とても乱れています.競争が激しいようです.みんなもこのように来るしかないようです.
お金を稼ぐということは、実は中国のインターネットの悪循環に入ったと思います.実はあなたの一家がうまくやったら、ダウンロード券やポイントなどはいらないです.
よく管理して、分類は明確にして、資源は多くつけて、みんなはすべてあなたのを使って、あなたはまったくお金に不足することはできなくて、ユーザーは多くて、流量は多くお金で、お金はユーザーから出して、
いつまでもいい方法ではない.