linux gdb网络调试工具,Linux--gdb调试工具
gdb是強大的調試工具,下面通過一個交換函數來初步認識他
main.c
#include
#include
void swap(int a, int b){
int t;
t = a;
a = b;
b = t;
}
int main()
{
int a = 3;
int b = 4;
swap(a, b);
printf("a = %d\n b = %d \n", a, b);
}
第一步:編譯命令
gcc -g -Wall main.c -o main
解釋:
gcc 是編譯命令
-g 在輸出的目標文件中包含調試信息
-Wall 產生警告信息
-o 指定編譯輸出文件名默認為a.out(為什么輸出文件沒有文件擴展名呢?參考另一篇筆記https://www.jianshu.com/p/f40188931d8b)
第二步:使用gdb
命令:
gdb main
輸出:
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
(gdb)
這樣我們就進入了gdb模式,可以使用gdb命令對程序進行調試
第三步:列出程序行
命令:
(gdb) l
輸出:
1 #include
2 #include
3
4 void swap(int a, int b){
5 int t;
6 t = a;
7 a = b;
8 b = t;
9 }
10
11 int main()
12 {
13 int a = 3;
14 int b = 4;
15 swap(a, b);
16 printf("a = %d\n b = %d \n", a, b);
17 }
第四步:加斷點 (b + 行號)
命令:
(gdb) b 9
輸出:
Breakpoint 1 at 0x400542: file main.c, line 9.
表示在內存0x400542處添加了第一個斷點
第五步:運行程序并在斷點處停止
命令:
(gdb) r
輸出:
Starting program: /home/yourname/WorkSpace/codeblocks/hellolinux/main
Breakpoint 1, swap (a=4, b=3) at main.c:9
9 }
第六步:查看調用棧
命令:
(gdb)bt
輸出:
#0 swap (a=4, b=3) at main.c:9
#1 0x000000000040056a in main () at main.c:15
該調用棧中存在兩個棧幀(后文解釋)
第七步:打印棧幀信息
命令:
p a
輸出:
$1 = 4
調用棧描述的是函數之間的調用關系,它由多個棧幀組成每個棧幀對應著沒有運行完的函數,棧幀中保存著該函數的信息比如:返回地址,局部變量等。程序執行到斷點處時swap函數還沒有調用完畢,依然存在調用棧中我們可以使用p命令來查看當前棧幀的的信息。通過上面的例子可以發現通過三變量法swap函數的形參a , b的值發生了交換
第八步:更換當前棧幀
命令:
(gdb)up
輸出:
#1 0x000000000040056a in main () at main.c:15
15 swap(a, b);
同上打印出main函數中的a , b
(gdb) p a
$3 = 3
(gdb) p b
$4 = 4
通過上面的的調試結果我們發現實際上a , b的值并沒有發生交換
第九步:退出調試
命令:
(gdb) q
輸出:
A debugging session is active.
Inferior 1 [process 11524] will be killed.
Quit anyway? (y or n) y
總結
以上是生活随笔為你收集整理的linux gdb网络调试工具,Linux--gdb调试工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洪恩识字app怎么取消自动续费(爆火的洪
- 下一篇: linux基本指令chmod,Linux