一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

調(diào)試器GDB的基本使用方法

 魅影蒼穹 2020-03-30

GDB調(diào)試的三種方式:

1. 目標(biāo)板直接使用GDB進(jìn)行調(diào)試。

2. 目標(biāo)板使用gdbserver,主機(jī)使用xxx-linux-gdb作為客戶端。

3. 目標(biāo)板使用ulimit -c unlimited,生成core文件;然后主機(jī)使用xxx-linux-gdb ./test ./core。

 Brendan Gregg關(guān)于gdb介紹《gdb Debugging Full Example (Tutorial): ncurses》。

1. gdb調(diào)試

構(gòu)造測(cè)試程序如下main.c和sum.c如下:

復(fù)制代碼
main.c:

#include <stdio.h> #include <stdlib.h> extern int sum(int value); struct inout { int value; int result; }; int main(int argc, char * argv[]) { struct inout * io = (struct inout * ) malloc(sizeof(struct inout)); if (NULL == io) { printf('Malloc failed.\n'); return -1; } if (argc != 2) { printf('Wrong para!\n'); return -1; } io -> value = *argv[1] - '0'; io -> result = sum(io -> value); printf('Your enter: %d, result:%d\n', io -> value, io -> result); return 0; }
sum.c:
int sum(int value) { int result = 0; int i = 0; for (i = 0; i < value; i++) result += (i + 1); return result; }
復(fù)制代碼

然后gcc main.c sum.c -o main -g, 得到main可執(zhí)行文件.

下面介紹了gdb大部分功能,1.1 設(shè)置斷點(diǎn)以及 1.3顯示棧幀是常用功能;調(diào)試過(guò)程中可以需要1.6 單步執(zhí)行,并且1.4 顯示變量、1.5顯示寄存器、1.8 監(jiān)視點(diǎn)、1.9 改變變量的值。

如果進(jìn)程已經(jīng)運(yùn)行中,需要1.11 attach到進(jìn)程,或者1.10 生成轉(zhuǎn)儲(chǔ)文件進(jìn)行分析。當(dāng)然為了提高效率可以自定義1.13 初始化文件。

1.1 設(shè)置斷點(diǎn)

設(shè)置斷點(diǎn)可以通過(guò)b或者break設(shè)置斷點(diǎn),斷點(diǎn)的設(shè)置可以通過(guò)函數(shù)名、行號(hào)、文件名+函數(shù)名、文件名+行號(hào)以及偏移量、地址等進(jìn)行設(shè)置。

格式為:

break 函數(shù)名

break 行號(hào)

break 文件名:函數(shù)名

break 文件名:行號(hào)

break +偏移量

break -偏移量

break *地址

查看斷點(diǎn),通過(guò)info break查看斷點(diǎn)列表。

刪除斷點(diǎn)通過(guò)命令包括:

delete <斷點(diǎn)id>:刪除指定斷點(diǎn)

delete:刪除所有斷點(diǎn)

clear

clear 函數(shù)名

clear 行號(hào)

clear 文件名:行號(hào)

clear 文件名:函數(shù)名

斷點(diǎn)還可以條件斷住

break 斷點(diǎn) if 條件;比如break sum if value==9,當(dāng)輸入的value為9的時(shí)候才會(huì)斷住。

condition 斷點(diǎn)編號(hào):給指定斷點(diǎn)刪除觸發(fā)條件

condition 斷點(diǎn)編號(hào) 條件:給指定斷點(diǎn)添加觸發(fā)條件

如下可以看出,當(dāng)入?yún)?的時(shí)候被斷住,而入?yún)?的時(shí)候運(yùn)行到結(jié)束。

斷點(diǎn)還可以通過(guò)disable/enable臨時(shí)停用啟用。

disable

disable 斷點(diǎn)編號(hào)

disable display 顯示編號(hào)

disable mem 內(nèi)存區(qū)域

enable

enable 斷點(diǎn)編號(hào)

enable once 斷點(diǎn)編號(hào):該斷點(diǎn)只啟用一次,程序運(yùn)行到該斷點(diǎn)并暫停后,該斷點(diǎn)即被禁用。

enable delete 斷點(diǎn)編號(hào)

enable display 顯示編號(hào)

enable mem 內(nèi)存區(qū)域

1.1.1 斷點(diǎn)commands高級(jí)功能

大多數(shù)時(shí)候需要在斷點(diǎn)處執(zhí)行一系列動(dòng)作,gdb提供了在斷點(diǎn)處執(zhí)行命令的高級(jí)功能commands。

復(fù)制代碼
#include <stdio.h>

int total = 0;

int square(int i)
{
    int result=0;

    result = i*i;

    return result;
}

int main(int argc, char **argv)
{
    int i;

    for(i=0; i<10; i++)
    {
        total += square(i);
    }
    return 0;
}
復(fù)制代碼

比如需要對(duì)如上程序square參數(shù)i為5的時(shí)候斷點(diǎn),并在此時(shí)打印棧、局部變量以及total的值

編寫(xiě)gdb.init如下:

復(fù)制代碼
set logging on gdb.log b square if i == 5 commands bt full i locals p total print 'Hit break when i == 5' end
復(fù)制代碼

在gdb shell中source gdb.init,然后r執(zhí)行命令,結(jié)果如下:

可以看出斷點(diǎn)在i==5的時(shí)候斷住了,并且此時(shí)打印了正確的值。

1.2 運(yùn)行

“gdb 命令”之后,run可以在gdb下運(yùn)行命令;如果命令需要參數(shù)則跟在run之后。

如果需要斷點(diǎn)在main()處,直接執(zhí)行start就可以。

1.3 顯示棧幀

如果遇到斷點(diǎn)而暫停執(zhí)行,或者coredump可以顯示棧幀。

通過(guò)bt可以顯示棧幀,bt full可以顯示局部變量。

命令格式如下:

bt

bt full:不僅顯示backtrace,還顯示局部變量

bt N:顯示開(kāi)頭N個(gè)棧幀

bt full N

1.4 顯示變量

“print 變量”可以顯示變量?jī)?nèi)容。

如果需要一行監(jiān)控多個(gè)變量,可以通過(guò)p {var1, var2, var3}。

如果要跟蹤自動(dòng)顯示,可以使用display {var1, var2, var3}

1.5 顯示寄存器

info reg可以顯示寄存器內(nèi)容。

在寄存器名之前加$可以顯示寄存器內(nèi)容,

p $寄存器:顯示寄存器內(nèi)容

p/x $寄存器:十六進(jìn)制顯示寄存器內(nèi)容。

 

用x命令可以顯示內(nèi)容內(nèi)容,“x/格式 地址”。

x $pc:顯示程序指針內(nèi)容

x/i $pc:顯示程序指針匯編。

x/10i $pc:顯示程序指針之后10條指令。

x/128wx 0xfc207000:從0xfc20700開(kāi)始以16進(jìn)制打印128個(gè)word。

還可以通過(guò)disassemble指令來(lái)反匯編。

disassemble

disassemble 程序計(jì)數(shù)器 :反匯編pc所在函數(shù)的整個(gè)函數(shù)。

disassemble addr-0x40,addr+0x40:反匯編addr前后0x40大小。

1.6 單步執(zhí)行

單步執(zhí)行有兩個(gè)命令next和step,兩者的區(qū)別是next遇到函數(shù)不會(huì)進(jìn)入函數(shù)內(nèi)部,step會(huì)執(zhí)行到函數(shù)內(nèi)部。

如果需要逐條匯編指令執(zhí)行,可以分別使用nexti和stepi。

1.7 繼續(xù)執(zhí)行

 調(diào)試時(shí),使用continue命令繼續(xù)執(zhí)行程序。程序遇到斷電后再次暫停執(zhí)行;如果沒(méi)有斷點(diǎn),就會(huì)一直執(zhí)行到結(jié)束。

continue:繼續(xù)執(zhí)行

continue 次數(shù):繼續(xù)執(zhí)行一定次數(shù)。

1.8 監(jiān)視點(diǎn)

要想找到變量在何處被改變,可以使用watch命令設(shè)置監(jiān)視點(diǎn)watchpoint。

watch <表達(dá)式>:表達(dá)式發(fā)生變化時(shí)暫停運(yùn)行

awatch <表達(dá)式>:表達(dá)式被訪問(wèn)、改變是暫停執(zhí)行

rwatch <表達(dá)式>:表達(dá)式被訪問(wèn)時(shí)暫停執(zhí)行

其他變種還包括watch expr [thread thread-id] [mask maskvalue],其中mask需要架構(gòu)支持。

GDB不能監(jiān)控一個(gè)常量,比如watch 0x600850報(bào)錯(cuò)。

但是可以watch *(int *)0x600850。

1.9 改變變量的值

“通過(guò)set variable <變量>=<表達(dá)式>”來(lái)修改變量的值。

 set $r0=xxx:設(shè)置r0寄存器的值為xxx。

1.10 生成內(nèi)核轉(zhuǎn)儲(chǔ)文件

通過(guò)“generate-core-file”生成core.xxxx轉(zhuǎn)儲(chǔ)文件。

然后gdb ./main ./core.xxxx查看恢復(fù)的現(xiàn)場(chǎng)。

另一命令gcore可以從命令行直接生成內(nèi)核轉(zhuǎn)儲(chǔ)文件。

gcore `pidof 命令`:無(wú)需停止正在執(zhí)行的程序已獲得轉(zhuǎn)儲(chǔ)文件。

1.11 attach到進(jìn)程 

如果程序已經(jīng)運(yùn)行,或者是調(diào)試陷入死循環(huán)而無(wú)法返回控制臺(tái)進(jìn)程,可以使用attach命令。

attach pid

通過(guò)ps aux可以查看進(jìn)程的pid,然后使用bt查看棧幀。

以top為例操作步驟為:

1. ps -aux查看進(jìn)程pid,為16974.

2. sudo gdb attach 16974,使用gdb 附著到top命令。

3. 使用bt full查看,當(dāng)前棧幀。此時(shí)使用print等查看信息。

4. 還可以通過(guò)info proc查看進(jìn)程信息。

1.12 反復(fù)執(zhí)行

continue、step、stepi、next、nexti都可以指定重復(fù)執(zhí)行的次數(shù)。

ignore 斷點(diǎn)編號(hào) 次數(shù):可以忽略指定次數(shù)斷點(diǎn)。

1.13 初始化文件

Linux環(huán)境下初始化文件為.gdbinit。

如果存在.gdbinit文件,gdb在啟動(dòng)的之前就將其作為命令文件運(yùn)行。

初始化文件和命令文件執(zhí)行順序?yàn)椋篐OME/.gdbinit > 運(yùn)行命令行選項(xiàng) > ./.gdbinit > -x指定命令文件。

1.14 設(shè)置源碼目錄

調(diào)試過(guò)程中如果需要關(guān)聯(lián)到源碼,查看更詳細(xì)的信息。

可以通過(guò)directory或者set substitute-path來(lái)制定源碼目錄。

1.15 TUI調(diào)試

TUI(TextUser Interface)為GDB調(diào)試的文本用戶界面,可以方便地顯示源代碼、匯編和寄存器文本窗口。

源代碼窗口和匯編窗口會(huì)高亮顯示程序運(yùn)行位置并以'>'符號(hào)標(biāo)記。有兩個(gè)特殊標(biāo)記用于標(biāo)識(shí)斷點(diǎn),第一個(gè)標(biāo)記用于標(biāo)識(shí)斷點(diǎn)類(lèi)型:

B:程序至少有一次運(yùn)行到了該斷點(diǎn)

b:程序沒(méi)有運(yùn)行到過(guò)該斷點(diǎn)

H:程序至少有一次運(yùn)行到了該硬件斷點(diǎn)

h:程序沒(méi)有運(yùn)行到過(guò)該硬件斷點(diǎn) 

第二個(gè)標(biāo)記用于標(biāo)識(shí)斷點(diǎn)使能與否:

+:斷點(diǎn)使能Breakpointis enabled. -:斷點(diǎn)被禁用Breakpointis disabled. 

當(dāng)調(diào)試程序時(shí),源代碼窗口、匯編窗口和寄存器窗口的內(nèi)容會(huì)自動(dòng)更新。

1.16 Catchpoint

catch可以根據(jù)某些類(lèi)型事件來(lái)停止程序執(zhí)行。

可以通過(guò)catch syscall close,捕捉產(chǎn)生系統(tǒng)調(diào)用close的時(shí)候停止程序執(zhí)行。

其他的catch事件還包括,throw、syscall、assert、exception等等。

1.17 自定義腳本

命令行的入?yún)⒖梢酝ㄟ^(guò)argc和*argv獲取。

1.17.0 注釋、賦值、顯示

# - 為腳本添加注釋。

set - 為變量賦值,以$開(kāi)頭,以便區(qū)分gdb還是調(diào)試程序變量。

例如:set $x = 1

顯示變量可以通過(guò)echo、printf。

1.17.1自定義命令

利用define命令可以自行定義命令,還可以使用document命令給自定義命令添加說(shuō)明。

復(fù)制代碼
define adder
  if $argc == 2
    print $arg0 + $arg1
  end
  if $argc == 3
    print $arg0 + $arg1 + $arg2
  end
end

document adder
  Sum two or three variables.
end
復(fù)制代碼

執(zhí)行bf自定義命令,結(jié)果如下。

 

無(wú)行參聲明,但可以直接用$arg0,$arg1引用, $argc 為形參個(gè)數(shù)

1.17.2 條件語(yǔ)句

條件命令:if...else...end。這個(gè)同其它語(yǔ)言中提供的if命令沒(méi)什么區(qū)別,只是注意結(jié)尾的end。

1.17.3 循環(huán)語(yǔ)句

循環(huán)命令:while...end。gdb同樣提供了loop_breakloop_continue命令分別對(duì)應(yīng)其它語(yǔ)言中的breakcontinue,另外同樣注意結(jié)尾的end。

復(fù)制代碼
set logging on overwrite gdb.log------------將顯示log保存到gdb.log中。 set pagination off--------------------------關(guān)閉分頁(yè)顯示功能。 tar jtag jtag://localhost:1025--------------連接上JTAG。 d-------------------------------------------刪除現(xiàn)有斷點(diǎn)。 b func_a------------------------------------在func_a增加斷點(diǎn)。 commands------------------------------------斷點(diǎn)后,執(zhí)行如下命令。 b func_b----------------------------------在func_a斷點(diǎn)之后,在func_b增加斷點(diǎn)。 commands
bt full-------------------------------打印func_b處棧幀。 c-------------------------------------繼續(xù)執(zhí)行。 end b file
.c:555------------------------------在file.c的555行增加斷點(diǎn) commands while 1-------------------------------無(wú)限執(zhí)行next命令。 next end end c-----------------------------------------繼續(xù)執(zhí)行,才會(huì)觸發(fā)func_b和file.c:555斷點(diǎn)。 end c-------------------------------------------是程序得到繼續(xù)執(zhí)行。
復(fù)制代碼

在命令行g(shù)db -x gdb.init bin;或者gdb bin,然后在命令行soruce gdb.init同樣可以更新腳本。

1.18 dump內(nèi)存到指定文件

在gdb調(diào)試中可能需要將一段內(nèi)存導(dǎo)出到文件中,可以借助dump命令。

命令格式:

dump binary memory FILE START STOP

比如dump binary memory ./dump.bin 0x0 0x008000000,將內(nèi)存區(qū)間從0x0到0x00800000導(dǎo)出到dump.bin中。

2. gdb+gdbserver遠(yuǎn)程調(diào)試

目標(biāo)板gdbserver+主機(jī)gdb遠(yuǎn)程調(diào)試的方式,比較適合目標(biāo)板性能受限,只能提供gdbserver功能。

在主機(jī)上執(zhí)行g(shù)db進(jìn)行遠(yuǎn)程調(diào)試。測(cè)試程序如下。

復(fù)制代碼
#include <stdio.h>

void C(int *p)
{
    *p = 0x12;
}

void B(int *p)
{
    C(p);
}
void A(int *p)
{
    B(p);
}
void A2(int *p)
{
    C(p);
}
int main(int argc, char **argv)
{
    int a;
    int *p = NULL;
    A2(&a);  // A2 > C
    printf('a = 0x%x\n', a);
    A(p);    // A > B > C
    return 0;
}
復(fù)制代碼

對(duì)目標(biāo)板的設(shè)置方式是:開(kāi)啟端口2345作為gdbserver銅線端口。

gdbserver :2345 test_debug

主機(jī)上執(zhí)行g(shù)db test_debug,然后tar remote 192.168.2.84.2345連接遠(yuǎn)程gdbserver。

目標(biāo)板會(huì)收到“Remote debugging from host 192.168.33.77”消息,表示兩者連接成功。

主機(jī)上就可以進(jìn)行遠(yuǎn)程調(diào)試,continue之后兩端得到的結(jié)果如下:

目標(biāo)板輸出“a=0x12”之后停止運(yùn)行,

主機(jī)上得到SIGSEGV,并可以查看backtrace信息??梢钥闯鰡?wèn)題點(diǎn)在指針p指向NULL,0指針賦值錯(cuò)誤。

3. 通過(guò)core+gdb離線分析

在目標(biāo)板上執(zhí)行ulimit -c unlimited,執(zhí)行應(yīng)用程序。

程序出錯(cuò)后,會(huì)在當(dāng)前目錄下生成core文件。

將core文件拷出后,再PC上執(zhí)行xxx-linux-gdb ./test ./core進(jìn)行分析。

3.1 加載庫(kù)文件

在運(yùn)行xxx-linux-gdb ./test ./core之后,可能存在庫(kù)文件關(guān)聯(lián)不上的情況。

使用info sharedlibrary,查看庫(kù)加載情況。

復(fù)制代碼
From To Syms Read Shared Object Library No xxx.so No /lib/libdl.so.2 No /lib/libpthread.so.0 0x2ab6ec00 0x2ac09ba4 Yes xxx/lib/libstdc++.so.6 No /lib/libm.so.6 0x2acec460 0x2acf626c Yes xxx/lib/libgcc_s.so.1 No /lib/libc.so.6 No /lib/ld.so.1
復(fù)制代碼

可以通過(guò)set solib-search-pathset solib-absolute-prefix來(lái)設(shè)置,對(duì)應(yīng)庫(kù)所在的路徑。

復(fù)制代碼
From        To          Syms Read   Shared Object Library
0x2aaca050  0x2aacc8d0  Yes         xxx.so
0x2aad0ad0  0x2aad17ac  Yes (*)     xxx/lib/libdl.so.2
0x2aad8a50  0x2aae7434  Yes (*)     xxx/lib/libpthread.so.0
0x2ab6ec00  0x2ac09ba4  Yes         xxx/lib/libstdc++.so.6
0x2ac4b3d0  0x2acb1988  Yes         xxx/lib/libm.so.6
0x2acec460  0x2acf626c  Yes         xxx/lib/libgcc_s.so.1
0x2ad17b80  0x2adf699e  Yes         xxx/lib/libc.so.6
0x2aaa89e0  0x2aabf66c  Yes (*)     xxx/lib/ld.so.1
(*): Shared library is missing debugging information.
復(fù)制代碼

可以看出相關(guān)庫(kù)文件都已經(jīng)加載,只是部分庫(kù)文件沒(méi)有調(diào)試信息。

3.2 查看backtrace

查看coredump的backtrace通過(guò)bt即可,更全的信息通過(guò)bt full。

產(chǎn)看函數(shù)調(diào)用棧的幾個(gè)函數(shù)

bt:顯示所有的函數(shù)調(diào)用棧幀的信息,每個(gè)幀一行。

bt n:顯示棧定的n個(gè)幀信息。

bt -n:顯示棧底的n個(gè)幀信息。

bt full:顯示棧中所有幀的完全信息如:函數(shù)參數(shù),本地變量。

bt full n:用法同上。

bt full -n

復(fù)制代碼
(gdb) bt #0 0x2ad71f1e in memcpy () from xxx/lib/libc.so.6 #1 0x2ad71ac0 in memmove () from xxx/lib/libc.so.6 #2 0x0011f36c in std::__copy_move<false, true, std::random_access_iterator_tag>::__copy_m<unsigned char> (__first=0x34dfb008 '\377\330\377', <incomplete sequence \340>, __last=0x34eeea2c '', ... #3 0x0011ee22 in std::__copy_move_a<false, unsigned char*, unsigned char*> (__first=0x34dfb008 '\377\330\377', <incomplete sequence \340>, __last=0x34eeea2c '', __result=0x2b2013c0 '\377\330\377', <incomplete sequence \340>) at xxxinclude/c++/6.3.0/bits/stl_algobase.h:386 #4 0x0011e7e2 in std::__copy_move_a2<false, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >, unsigned char*> (__first=..., __last=..., __result=0x2b2013c0 '\377\330\377', <incomplete sequence \340>) at xxx/bits/stl_algobase.h:424 #5 0x0011dfd2 in std::copy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >, unsigned char*> (__first=..., __last=..., __result=0x2b2013c0 '\377\330\377', <incomplete sequence \340>) at xxx/6.3.0/bits/stl_algobase.h:456 #6 0x0011c948 in xxx #7 0x00133e08 in xxx #8 0x2aada31e in start_thread () from xxx/libc/lib/libpthread.so.0 #9 0x005a11b4 in ?? ()
復(fù)制代碼

3.3 Core Dump核心轉(zhuǎn)存儲(chǔ)文件目錄和命名規(guī)則

默認(rèn)情況下core文件存在應(yīng)用當(dāng)前路徑下,為了區(qū)分可以進(jìn)行設(shè)置。

區(qū)分core主要通過(guò)/proc/sys/kernel/core_uses_pid和/proc/sys/kernel/core_pattern進(jìn)行設(shè)置。

/proc/sys/kernel/core_uses_pid:可以控制產(chǎn)生的core文件的文件名中是否添加pid作為擴(kuò)展,如果添加則文件內(nèi)容為1,否則為0。

proc/sys/kernel/core_pattern:可以設(shè)置格式化的core文件保存位置或文件名,比如原來(lái)文件內(nèi)容是core-%e

echo '/tmp/core-%e-%p' > core_pattern。

將會(huì)控制所產(chǎn)生的core文件會(huì)存放到/corefile目錄下,產(chǎn)生的文件名為core-命令名-pid-時(shí)間戳

以下是參數(shù)列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加當(dāng)前uid
    %g - insert current gid into filename 添加當(dāng)前gid
    %s - insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生core的信號(hào)
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時(shí)的unix時(shí)間
    %h - insert hostname where the coredump happened into filename 添加主機(jī)名
    %e - insert coredumping executable name into filename 添加命令名

當(dāng)然,你可以用下列方式來(lái)完成:

sysctl -w kernel.core_pattern=/tmp/core-%e-%p

3.4 ulimit的使用

功能說(shuō)明:控制shell程序的資源。

語(yǔ)  法:ulimit [-aHS][-c <core文件上限>][-d <數(shù)據(jù)節(jié)區(qū)大小>][-f <文件大小>][-m <內(nèi)存大小>][-n <文件數(shù)目>][-p <緩沖區(qū)大小>][-s <堆疊大小>][-t <CPU時(shí)間>][-u <程序數(shù)目>][-v <虛擬內(nèi)存大小>]

補(bǔ)充說(shuō)明:ulimit為shell內(nèi)建指令,可用來(lái)控制shell執(zhí)行程序的資源。

參  數(shù):
   -a  顯示目前資源限制的設(shè)定。 
   -c <core文件上限>  設(shè)定core文件的最大值,單位為區(qū)塊。 
   -d <數(shù)據(jù)節(jié)區(qū)大小>  程序數(shù)據(jù)節(jié)區(qū)的最大值,單位為KB。 
   -f <文件大小>  shell所能建立的最大文件,單位為區(qū)塊。 
   -H  設(shè)定資源的硬性限制,也就是管理員所設(shè)下的限制。 
   -m <內(nèi)存大小>  指定可使用內(nèi)存的上限,單位為KB。 
   -n <文件數(shù)目>  指定同一時(shí)間最多可開(kāi)啟的文件數(shù)。 
   -p <緩沖區(qū)大小>  指定管道緩沖區(qū)的大小,單位512字節(jié)。 
   -s <堆疊大小>  指定堆疊的上限,單位為KB。 
   -S  設(shè)定資源的彈性限制。 
   -t <CPU時(shí)間>  指定CPU使用時(shí)間的上限,單位為秒。 
   -u <程序數(shù)目>  用戶最多可開(kāi)啟的程序數(shù)目。 
   -v <虛擬內(nèi)存大小>  指定可使用的虛擬內(nèi)存上限,單位為KB。

4. GDB小技巧

4.1 關(guān)閉 Type <return> to continue, or q <return> to quit---

當(dāng)現(xiàn)實(shí)內(nèi)容多的時(shí)候,GDB會(huì)強(qiáng)制分頁(yè),現(xiàn)實(shí)就會(huì)暫停。但是可能并不需要,可以通過(guò)set pagination off關(guān)閉。

4.2 附著到已運(yùn)行kernel

在已運(yùn)行的Linux上,如果發(fā)生死機(jī)異常等問(wèn)題,這時(shí)候定位問(wèn)題需要使用jtag連接上。

連接方法是:

gdb-----------------------------------------------進(jìn)入gdb shell。
target remote localhost:1025-------------------在gdb shell中通過(guò)ip:port連接上target。
file vmlinux----------------------------------------加載符號(hào)表。

然后就可以在線查看運(yùn)行狀態(tài)了。

參考文檔:

Linux環(huán)境下段錯(cuò)誤的產(chǎn)生原因及調(diào)試方法小結(jié)》《linux應(yīng)用調(diào)試技術(shù)之GDB和GDBServer》《gdbServer + gdb 調(diào)試

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    精品熟女少妇av免费久久野外| 久久香蕉综合网精品视频| 四十女人口红哪个色好看| 69久久精品亚洲一区二区| 国产中文字幕一二三区| 午夜成年人黄片免费观看| 国产一区麻豆水好多高潮| 女同伦理国产精品久久久| 色婷婷丁香激情五月天| 亚洲做性视频在线播放| 一区二区在线激情视频| 日本加勒比不卡二三四区| 伊人网免费在线观看高清版 | 亚洲一区二区久久观看| 精品午夜福利无人区乱码| 深夜视频成人在线观看| 麻豆视传媒短视频免费观看| 日本午夜免费观看视频| 亚洲欧美日韩中文字幕二欧美 | 大屁股肥臀熟女一区二区视频 | 天堂网中文字幕在线视频| 丰满少妇被猛烈撞击在线视频| 日韩欧美黄色一级视频| 亚洲精品福利视频在线观看| 国产一级精品色特级色国产| 亚洲性日韩精品一区二区| 午夜福利国产精品不卡| 亚洲欧美日韩精品永久| 欧美一区二区三区喷汁尤物| 亚洲欧美日韩国产综合在线| 欧美一级特黄大片做受大屁股| 麻豆蜜桃星空传媒在线观看| 亚洲午夜av一区二区| 一区二区三区日本高清| 色丁香之五月婷婷开心| 91亚洲国产日韩在线| 欧美黑人黄色一区二区| 亚洲欧洲在线一区二区三区| 国产白丝粉嫩av在线免费观看| 久热人妻中文字幕一区二区| 亚洲国产av在线观看一区|