程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 調試器(GDB)的基本使用方法(之二)

調試器(GDB)的基本使用方法(之二)

編輯:關於C

attach到進程 使用的文件:
/*filename:    test_attach.c
*description: This file used to test the attach command of gdb
*author:      Howard
*date:        2013-11-25
*version:     v1.0
*/

#ifndef ATTACHTEST
#define ATTACHTEST

#include <stdio.h>
#include <unistd.h>

#endif

int main(int argc, char *argv[])
{
        while(1){
                sleep(10);
        }

        return 0;
}


使用下面的方法編譯並運行: $ gcc -Wall -O2 -g -o test_attach test_attach.c
$ ./test_attach &
[1] 2901
$ ps aux | grep test_attach
<username> 2901 0.0 0.0 2000 284 pts/2 S 19:20 0:00 ./test_attach
<username> 3021 0.0 0.1 6076 836 pts/2 S+ 19:21 0:00 grep --color=auto test_attach
使用attach命令: (gdb) attach 2901
Attaching to process 2901
Reading symbols from /home/shuaihua/test_attach...done.
Reading symbols from /lib/i386-linux-gnu/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
0x00a1c416 in __kernel_vsyscall () 注意:這個地方可能需要超級用戶權限來執行,我使用的ubuntu12.04測試的。
使用顯示棧幀可以看進程是怎樣陷入等待狀態的: (gdb) bt
#0 0x00a1c416 in __kernel_vsyscall ()
#1 0x004d9f00 in nanosleep () from /lib/i386-linux-gnu/libc.so.6
#2 0x004d9d1f in sleep () from /lib/i386-linux-gnu/libc.so.6
#3 0x0804834c in main (argc=1, argv=0xbfdab6c4) at test_attach.c:19 可以看出程序調用了sleep()函數而鍵入等待裝填的從源文件中可以找到此行代碼。
使用info proc可以查看進程信息: (gdb) info proc
process 2901
cmdline = './test_attach'
cwd = '/home/<username>'
exe = '/home/<username>/test_attach'
最後使用detach命令可以將gdb與進程分離。 (gdb) detach
Detaching from program: /home/<username>/test_attach, process 2901

條件斷點 條件斷點僅在特定條件下中斷。 格式: break 斷點 if 條件 condition 斷點編號 條件——給指定的斷點添加或刪除觸發條件 如果條件為真則暫停運行。 反復執行 格式: ignore 斷點編號 次數 在編號指定的斷點、監視點(watchpoint)或捕獲點(catchpoint)忽略指定的次數。 continue與ignore一樣,有類似的功能。 執行指定次數的命令: 格式: continue 次數 step 次數 stepi 次數 next 次數 nexti 次數 finish命令執行完當前函數後暫停,until命令執行完當前函數等代碼塊後暫停,如果是循環,則執行完尊換後暫停。 格式: finish until until 地址
刪除斷點和禁用斷點 clear可以刪除已定義的斷點,disable可以臨時禁用斷點。 格式: clear clear 函數名 clear 行號 clear 文件名:行號 clear 文件名:函數名 delete [breakpoints] 斷點編號 格式: disable [breakpoints] disable [breakpoints] 斷點編號 disable display 顯示編號 disable mem 內存區域 如果不指定斷點號,則表示禁用所有斷點。 enable [breakpoints] enable [breakpoints] 斷點編號 enable [breakpoints] once 斷點編號 enable [breakpoints] delete 斷點編號 enable display 顯示編號 enable mem 內存區域 once是指定的斷點只啟用一次,delete是在暫停後刪除斷點。
斷點命令
在斷點中斷時自動執行的命令。 格式: commands 斷點編號 命令 ...... end $ gdb
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
(gdb) file staticvariable
Reading symbols from /home/shuaihua/CLan/staticvariable...done.
(gdb) info b
No breakpoints or watchpoints.
(gdb) b 28 if k==100
Breakpoint 1 at 0x80483a5: file staticvariable.c, line 28.
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>p k
>end
(gdb) b main
Breakpoint 2 at 0x8048359: file staticvariable.c, line 19.
(gdb) command 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>p j
>end
(gdb) run
Starting program: /home/shuaihua/CLan/staticvariable

Breakpoint 2, main () at staticvariable.c:19
19 {
$1 = 0
(gdb) n
28 printf("i = :%d\n", i);
(gdb) n
19 {
(gdb) n
28 printf("i = :%d\n", i);
(gdb) n
19 {
(gdb) n
28 printf("i = :%d\n", i);
(gdb) n
i = :10
j = :1

Breakpoint 1, main () at staticvariable.c:32
32 }
$2 = 100
(gdb) n
0x0014c4d3 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
(gdb) n
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 2950) exited normally]

/* FileName:    staticvariable.c
* Description: 用來測試靜態變量的輸出結果。
* Author:      Howard
* Date:        2013-12-05
* Version:     v1.0
*/

#include <stdio.h>

static int j = 0;

int func1(void)
{
     static int i = 0;
     i ++;
     return i;
}

void func2(void)
{
     j = 0;
     j ++;
} 

int main(void)
{
     int k;
     int i;
     
     for (k=0; k<10; k++){
          i = func1();
          func2();
     }
     k = 100;
     printf("i = :%d\n", i);
     printf("j = :%d\n", j);
     
     return 0;
}



常用命令及省略形式 命令 簡寫形式 說明 backtrace bt、where 顯示backtrace break b 設置斷點 continue c 繼續運行 delete d 刪除斷點 finish   運行到函數結束處 info breakpoints info b 顯示斷點信息 next n 執行下一行 print p 顯示表達式 run r 運行程序 step s 一次執行一行,但是可以進入到函數內部(這點與next不同) x   顯示內存內容 until u 執行到指定的行 其他命令 命令 簡寫形式 說明 directory dir 插入目錄 disable dis 禁用斷點 down do 在當前調用棧中選擇要顯示的棧幀 edit e 編輯問價或函數 frame f 選擇要顯示的棧幀 forward-search fo 向前搜索 generate-core-file gcore 生成內核轉儲 help h 顯示幫助一欄 info i 顯示信息 list l 顯示函數或行 nexti ni 執行下一行(以匯編代碼為單位) print-object po 顯示目標信息 sharedlibrary share 加載共享庫的符號 stepi si 執行下一行

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved