• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            EverSpring working shop

            To pursue creative ideas based on nature.

            統(tǒng)計

            留言簿(1)

            他山之石

            閱讀排行榜

            評論排行榜

            GDB Tutorial for beginners (From network, i am reading also.)

            QUOTE

                  The  purpose  of a debugger such as GDB is to allow you to see what is
                  going on ‘‘inside’’ another program while it executes—or what  another
                  program was doing at the moment it crashed.
                                                                                           
                  GDB  can do four main kinds of things (plus other things in support of
                  these) to help you catch bugs in the act:
                                                                                           
                      ·  Start your program, specifying anything that might  affect  its
                          behavior.
                                                                                           
                      ·  Make your program stop on specified conditions.
                                                                                           
                      ·  Examine what has happened, when your program has stopped.
                                                                                           
                      ·  Change  things in your program, so you can experiment with cor-
                          recting the effects of  one  bug  and  go  on  to  learn  about
                          another.
            --GDB Manpage


            The first thing you need to do to start debugging your program is to compile it with debugging symbols, this is accomplished with the -g flag:
            gcc filename.c -g -o filename
            g++ filename.cpp -g -o filename


            Lets start with a simple program that gets a line of text from the user, and prints it out backwards to the screen:


            CODE

            #include <stdio.h>
                                                                                                                                                                         
            int main(){

            char input[50];
            int i=0;

            scanf("%s",input);

            for(i=strlen(input);i>=0;i--)
               { printf("%c",input[i]);}
            printf("\n");

            return 0;
            }



            compile and start the debugger with:
            gcc -g debug.c
            gdb ./a.out

            You should now be in the debugger.


            There are 8 main commands that you will mostly be using in your debugging session

            1.) break
            2.) run
            3.) print
            4.) next
            5.) step
            6.) continue
            7.) display
            8.) where



            1.) The Break Command:
            gdb will remeber the line numbers of your source file. This will let us easily set up break points in the program. A break point, is a line in the code where you want execution to pause. Once you pause execution you will be able to examine variables, and walk through the program, and other things of that nature.
            Continueing with our example lets set up a break point at line 6, just before we declare int i=0;

            QUOTE

            (gdb) break 6
            Breakpoint 1 at 0x80483ec: file debug.c, line 6.
            (gdb)




            2.) The Run Command
            Run will begin inital execution of your program. This will run your program as you normally would outside of the debugger, until it reaches a break point line.
            At this moment, you will have been returned to the gdb command prompt.
            (Using run again after your prgram has been started, will ask to terminate the current execution and start over)

            From our example:

            QUOTE

            (gdb) run
            Starting program: /u/khan/tmp/a.out
                                                                                           
            Breakpoint 1, main () at debug.c:6
            6      int i=0;
            (gdb)



            3.)The Print Command
            Print will let you see the values of data in your program. It takes an argument of the variable name.
            In our example, we are paused right before we declare and intitalize i. Lets look what the value of i is now:

            QUOTE

            (gdb) print i
            $1 = -1075457232
            (gdb)


            i contains junk, we havent put anything into it yet.


            4. & 5.) Next and Step
            Next and Step do basically the same thing, step line by line through the program. The difference is that next steps over a function call, and step will step into it.

            Now in our example, we will step to the beginning of the next instruction

            QUOTE

            (gdb) step
            8      scanf("%s",input);
            (gdb)


            before we execute the scanf, lets check the value of i again:
            QUOTE
            (gdb) print i
            $2 = 0
            (gdb)


            i is now equal to 0, like it should be.

            Now lets use next to move into the scanf statement:
            QUOTE

            (gdb) next


            What happened here? We werent returned to the gdb prompt. Well the program is inside scanf, waiting for us to input something.
            Input string here, and press enter:


            6.) The Continue Command
            Continue will pick up execution of the program after it has reached a break point.

            Lets continue to the end of the program now:
            QUOTE

            (gdb) continue
            Continuing.
            tupni

            Program exited normally.
            (gdb)


            Here we've reached the end of our program, you can see that it printed in resevese "input" which was what I fed it in scanf.


            7.) The Display Command
            display will show a vaiables contents each step of the way in your program. Lets start over in our example. Delete the breakpoint at line 6
            QUOTE

            (gdb) del break 1

            This deletes our first breakpoint at line 6.

            Now lets set a new breakpoint at line 11, the printf statement inside the for loop
            QUOTE

            (gdb) break 11
            Breakpoint 3 at 0x8048421: file debug.c, line 11.
            (gdb)


            Run the program again, and enter the input, when it returns to the gdb command prompt we will display input[i] and watch it through the for loop

            QUOTE

            Breakpoint 3, main () at debug.c:11
            11      { printf("%c",input[i]);}
            (gdb) display input[i]
            1: input[i] = 0 '\0'
            (gdb) next
            10      for(i=strlen(input);i>=0;i--)
            1: input[i] = 0 '\0'
            (gdb) next

            Breakpoint 3, main () at debug.c:11
            11      { printf("%c",input[i]);}
            1: input[i] = 116 't'
            (gdb) next
            10      for(i=strlen(input);i>=0;i--)
            1: input[i] = 116 't'
            (gdb) next

            Breakpoint 3, main () at debug.c:11
            11      { printf("%c",input[i]);}
            1: input[i] = 117 'u'
            (gdb) next
            10      for(i=strlen(input);i>=0;i--)
            1: input[i] = 117 'u'
            (gdb) next

            Breakpoint 3, main () at debug.c:11
            11      { printf("%c",input[i]);}
            1: input[i] = 112 'p'
            (gdb) next
            10      for(i=strlen(input);i>=0;i--)
            1: input[i] = 112 'p'
            (gdb) next

            Breakpoint 3, main () at debug.c:11
            11      { printf("%c",input[i]);}
            1: input[i] = 110 'n'
            (gdb) next
            10      for(i=strlen(input);i>=0;i--)
            1: input[i] = 110 'n'
            (gdb) next

            Breakpoint 3, main () at debug.c:11
            11      { printf("%c",input[i]);}
            1: input[i] = 105 'i'
            (gdb) next
            10      for(i=strlen(input);i>=0;i--)
            1: input[i] = 105 'i'
            (gdb) next
            12      printf("\n");
            1: input[i] = -1 '\uffff'
            (gdb)

            Here we stepped through the loop, always looking at what input[i] was equal to.


            9.)The Where Command
            The where command prints a backtrace of all stack frames. This may not make much since but it is useful in seeing where our program crashes.

            Lets modify our program just a little so that it will crash:
            CODE

            #include <stdio.h>
                                                                                                                                                                         
            int main(){

            char *input;
            int i=0;

            scanf("%s",input);

            for(i=strlen(input);i>=0;i--)
               { printf("%c",input[i]);}
            printf("\n");

            return 0;
            }


            Here we've changed input to be a pointer to a char.

            Recompile and run gdb on it again.

            and see what happens when it crashes

            QUOTE


            (gdb) r
            Starting program: /u/khan/tmp/a.out
            AAA

            Program received signal SIGSEGV, Segmentation fault.
            0x009ef267 in _IO_vfscanf_internal () from /lib/tls/libc.so.6
            (gdb) where
            #0  0x009ef267 in _IO_vfscanf_internal () from /lib/tls/libc.so.6
            #1  0x009f3808 in scanf () from /lib/tls/libc.so.6
            #2  0x08048403 in main () at debug.c:8
            (gdb)



            We see at the bottom, three frames,
            #2, the top most shows where we crashed at.

            use the up command to move up the stack
            QUOTE

            (gdb) up
            #1  0x009f3808 in scanf () from /lib/tls/libc.so.6
            (gdb) up
            #2  0x08048403 in main () at debug.c:8
            8      scanf("%s",input);
            (gdb)

            Here we see line #8
            8 scanf("%s",input);

            The line we crashed at.




            These are the basics to gdb, you can now find where a program crashed, watch variables, and step through line by line of your program.

            For more info check out the info page
            info gdb

            posted on 2007-10-12 22:02 everspring79 閱讀(847) 評論(0)  編輯 收藏 引用 所屬分類: Tools

            天堂无码久久综合东京热| 久久一日本道色综合久久| 91精品国产综合久久四虎久久无码一级 | 99久久精品免费看国产一区二区三区| 久久久受www免费人成| 久久精品亚洲日本波多野结衣| 日本久久久久久中文字幕| 精品久久久久成人码免费动漫 | 久久96国产精品久久久| 看全色黄大色大片免费久久久| 午夜天堂精品久久久久| 久久久久婷婷| 久久精品国产亚洲AV无码偷窥 | 久久精品国产亚洲7777| 欧洲精品久久久av无码电影| 精品欧美一区二区三区久久久| 色狠狠久久AV五月综合| 热久久最新网站获取| 97精品伊人久久久大香线蕉| 久久久久99精品成人片直播| 午夜精品久久久久久影视riav| 国产激情久久久久影院小草 | 国产精品久久久久久久久鸭| 久久久国产打桩机| 一本久久免费视频| 日韩欧美亚洲综合久久影院Ds | 香港aa三级久久三级老师2021国产三级精品三级在 | 一本一本久久a久久精品综合麻豆| 日本道色综合久久影院| 九九久久自然熟的香蕉图片| 久久久高清免费视频| 久久综合鬼色88久久精品综合自在自线噜噜| 久久综合欧美成人| 日本三级久久网| 国产精品99久久久久久猫咪 | 久久婷婷五月综合成人D啪| 亚洲?V乱码久久精品蜜桃 | 久久午夜福利无码1000合集| 亚洲精品久久久www| 精品伊人久久久| 久久精品亚洲中文字幕无码麻豆|