1. 程式人生 > >linux下gdb單步除錯

linux下gdb單步除錯

用 GDB 除錯程式

GDB 概述
————

GDB GNU開源組織釋出的一個強大的 UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像 VC BCB IDE的除錯,但如果你是在 UNIX平臺下做軟體,你會發現 GDB這個除錯工具有比 VC BCB的圖形化偵錯程式更強大的功能。所謂寸有所長,尺有所短就是這個道理。

一般來說, GDB主要幫忙你完成下面四個方面的功能:

    1 、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
    2
、可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
    3

、當程式被停住時,可以檢查此時你的程式中所發生的事。
    4
、動態的改變你程式的執行環境。

從上面看來, GDB和一般的除錯工具沒有什麼兩樣,基本上也是完成這些功能,不過在細節上,你會發現 GDB這個除錯工具的強大,大家可能比較習慣了圖形化的除錯工具,但有時候,命令列的除錯工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。


一個除錯示例
——————

源程式: tst.c

     1 #include <stdio.h>
     2
     3 int func(int n)
     4 {
     5         int sum=0,i;
     6         for(i=0; i<n; i++)
     7         {
     8                 sum+=i;
     9         }
    10         return sum;
    11 }
    12
    13
    14 main()
    15 {
    16         int i;
    17         long result = 0;
    18         for(i=1; i<=100; i++)
    19         {
    20                 result += i;
    21         }
    22
    23        printf("result[1-100] = %d \n", result );
    24        printf("result[1-250] = %d \n", func(250) );
    25 }

編譯生成執行檔案:( Linux下)
    hchen/test> cc -g tst.c -o tst

使用 GDB除錯:

hchen/test> gdb tst  <---------- 啟動 GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l     <-------------------- l

命令相當於 list,從第一行開始例出原碼。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <--------------------
直接回車表示,重複上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;   
(gdb) break 16    <--------------------
設定斷點,在源程式第 16行處。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <--------------------
設定斷點,在函式 func()入口處。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <--------------------
檢視斷點資訊。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <---------------------
執行程式, run命令簡寫
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <---------- 在斷點處停住。
17               long result = 0;
(gdb) n          <---------------------
單條語句執行, next命令簡寫。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <---------------------
繼續執行程式, continue命令簡寫。
Continuing.
result[1-100] = 5050       <----------
程式輸出。

Breakpoint 2, func (n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <---------------------
列印變數 i的值, print命令簡寫。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <---------------------
檢視函式堆疊。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <---------------------
退出函式。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d \n", func(250) );
Value returned is $6 = 31375
(gdb) c     <---------------------
繼續執行。
Continuing.
result[1-250] = 31375    <----------
程式輸出。

Program exited with code 027. <-------- 程式退出,除錯結束。
(gdb) q     <---------------------
退出 gdb
hchen/test>

好了,有了以上的感性認識,還是讓我們來系統地認識一下 gdb吧。


使用 GDB
————

一般來說 GDB主要除錯的是 C/C++的程式。要除錯 C/C++的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器( cc/gcc/g++)的 -g引數可以做到這一點。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

如果沒有 -g,你將看不見程式的函式名、變數名,所代替的全是執行時的記憶體地址。當你用 -g把除錯資訊加入之後,併成功編譯目的碼以後,讓我們來看看如何用 gdb來除錯他。

啟動 GDB的方法有以下幾種:

    1 gdb <program>
       program
也就是你的執行檔案,一般在當然目錄下。

    2 gdb <program> core
      
gdb同時除錯一個執行程式和 core檔案, core是程式非法執行後 core dump後產生的檔案。

    3 gdb <program> <PID>
      
如果你的程式是一個服務程式,那麼你可以指定這個服務程式執行時的程序 ID gdb會自動 attach上去,並除錯他。 program應該在 PATH環境變數中搜索得到。

GDB 啟動時,可以加上一些 GDB的啟動開關,詳細的開關可以用 gdb -help檢視。我在下面只例舉一些比較常用的引數:

    -symbols <file>
    -s <file>
   
從指定檔案中讀取符號表。

    -se file
   
從指定檔案中讀取符號表資訊,並把他用在可執行檔案中。

    -core <file>
    -c <file>
   
除錯時 core dump core檔案。

    -directory <directory>
    -d <directory>
   
加入一個原始檔的搜尋路徑。預設搜尋路徑是環境變數中 PATH所定義的路徑。

GDB 的命令概貌
———————

啟動 gdb後,就你被帶入 gdb的除錯環境中,就可以使用 gdb的命令開始除錯程式了, gdb的命令可以使用 help命令來檢視,如下所示:

    /home/hchen> gdb
    GNU gdb 5.1.1
    Copyright 2002 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i386-suse-linux".
    (gdb) help
    List of classes of commands:

    aliases -- Aliases of other commands
    breakpoints -- Making program stop at certain points
    data -- Examining data
    files -- Specifying and examining files
    internals -- Maintenance commands
    obscure -- Obscure features
    running -- Running the program
    stack -- Examining the stack
    status -- Status inquiries
    support -- Support facilities
    tracepoints -- Tracing of program execution without stopping the program
    user-defined -- User-defined commands

    Type "help" followed by a class name for a list of commands in that class.
    Type "help" followed by command name for full documentation.
    Command name abbreviations are allowed if unambiguous.
    (gdb)

gdb 的命令很多, gdb把之分成許多個種類。 help命令只是例出 gdb的命令種類,如果要看種類中的命令,可以使用 help <class>命令,如: help breakpoints,檢視設定斷點的所有命令。也可以直接 help <command>來檢視命令的幫助。


gdb
中,輸入命令時,可以不用打全命令,只用打命令的前幾個字元就可以了,當然,命令的前幾個字元應該要標誌著一個唯一的命令,在 Linux下,你可以敲擊兩次 TAB鍵來補齊命令的全稱,如果有重複的,那麼 gdb會把其例出來。示例一:在進入函式 func時,設定一個斷點。可以敲入 break func,或是直接就是 b func
    (gdb) b func
    Breakpoint 1 at 0x8048458: file hello.c, line 10.
 
   
示例二:敲入 b按兩次 TAB鍵,你會看到所有 b打頭的命令:
    (gdb) b
    backtrace  break      bt
    (gdb)

示例三:只記得函式的字首,可以這樣:
    (gdb) b make_ <
TAB >
   
(再按下一次 TAB鍵,你會看到 :
    make_a_section_from_file     make_environ
    make_abs_section             make_function_type
    make_blockvector             make_pointer_type
    make_cleanup                 make_reference_type
    make_command                 make_symbol_completion_list
    (gdb) b make_
    GDB
把所有 make開頭的函式全部例出來給你檢視。

示例四:除錯 C++的程式時,有可以函式名一樣。如:
    (gdb) b 'bubble( M-?
    bubble(double,double)    bubble(int,int)
    (gdb) b 'bubble(
   
你可以檢視到 C++中的所有的過載函式及引數。(注: M-?按兩次 TAB是一個意思)

要退出 gdb時,只用發 quit或命令簡稱 q就行了。

GDB 中執行 UNIX 的 shell 程式
————————————

gdb環境中,你可以執行 UNIX shell的命令,使用 gdb shell命令來完成:

    shell <command string>
   
呼叫 UNIX shell來執行 <command string>,環境變數 SHELL中定義的 UNIX shell將會被用來執行 <command string>,如果 SHELL沒有定義,那就使用 UNIX的標準 shell /bin/sh。(在 Windows中使用 Command.com cmd.exe

還有一個 gdb命令是 make
    make <make-args>
   
可以在 gdb中執行 make命令來重新 build自己的程式。這個命令等價於 “ shell make <make-args> ”

在 GDB 中執行程式
————————

當以 gdb <program>方式啟動 gdb後, gdb會在 PATH路徑和當前目錄中搜索 <program>的原始檔。如要確認 gdb是否讀到原始檔,可使用 l list命令,看看 gdb是否能列出原始碼。

gdb中,執行程式使用 r或是 run命令。程式的執行,你有可能需要設定下面四方面的事。

1 、程式執行引數。
    set args
可指定執行時引數。(如: set args 10 20 30 40 50
    show args
命令可以檢視設定好的執行引數。

2 、執行環境。
    path <dir>
可設定程式的執行路徑。
    show paths
檢視程式的執行路徑。
    set environment varname [=value]
設定環境變數。如: set env USER=hchen
    show environment [varname]
檢視環境變數。

3 、工作目錄。
    cd <dir>
相當於 shell cd命令。
    pwd
顯示當前的所在目錄。

4 、程式的輸入輸出。
    info terminal
顯示你程式用到的終端的模式。使用重定向控制程式輸出。如: run > outfile
    tty
命令可以指寫輸入輸出的終端裝置。如: tty /dev/ttyb


除錯已執行的程式
————————

兩種方法:
1
、在 UNIX下用 ps檢視正在執行的程式的 PID(程序 ID),然後用 gdb <program> PID格式掛接正在執行的程式。
2
、先用 gdb <program>關聯上原始碼,並進行 gdb,在 gdb中用 attach命令來掛接程序的 PID。並用 detach來取消掛接的程序。

暫停 / 恢復程式執行
—————————

除錯程式中,暫停程式執行是必須的, GDB可以方便地暫停程式的執行。你可以設定程式的在哪行停住,在什麼條件下停住,在收到什麼訊號時停往等等。以便於你檢視執行時的變數,以及執行時的流程。

當程序被 gdb停住時,你可以使用 info program來檢視程式的是否在執行,程序號,被暫停的原因。

gdb中,我們可以有以下幾種暫停方式:斷點( BreakPoint)、觀察點( WatchPoint)、捕捉點( CatchPoint)、訊號( Signals)、執行緒停止( Thread Stops)。如果要恢復程式執行,可以使用 c或是 continue命令。


一、設定斷點( BreakPoint )
   
   
我們用 break命令來設定斷點。正面有幾點設定斷點的方法:
   
    break <function>
       
在進入指定函式時停住。 C++中可以使用 class::function function(type,type)格式來指定函式名。

    break <linenum>
       
在指定行號停住。

    break +offset
    break -offset
       
在當前行號的前面或後面的 offset行停住。 offiset為自然數。

    break filename:linenum
       
在原始檔 filename linenum行處停住。

    break filename:function
       
在原始檔 filename function函式的入口處停住。

    break *address
       
在程式執行的記憶體地址處停住。

    break
        break
命令沒有引數時,表示在下一條指令處停住。

    break ... if <condition>
        ...
可以是上述的引數, condition表示條件,在條件成立時停住。比如在迴圈境體中,可以設定 break if i=100,表示當 i 100時停住程式。

檢視斷點時,可使用 info命令,如下所示:(注: n表示斷點號)
    info breakpoints [n]
    info break [n]
   

二、設定觀察點( WatchPoint )
   
   
觀察點一般來觀察某個表示式(變數也是一種表示式)的值是否有變化了,如果有變化,馬上停住程式。我們有下面的幾種方法來設定觀察點:
   
    watch <expr>
       
為表示式(變數) expr設定一個觀察點。一量表達式值有變化時,馬上停住程式。
       
    rwatch <expr>
       
當表示式(變數) expr被讀時,停住程式。
       
    awatch <expr>
       
當表示式(變數)的值被讀或被寫時,停住程式。
   
    info watchpoints
       
列出當前所設定了的所有觀察點。


三、設定捕捉點( CatchPoint )

你可設定捕捉點來補捉程式執行時的一些事件。如:載入共享庫(動態連結庫)或是 C++的異常。設定捕捉點的格式為:
   
    catch <event>
       
event發生時,停住程式。 event可以是下面的內容:
        1
throw一個 C++丟擲的異常。( throw為關鍵字)
        2
catch一個 C++捕捉到的異常。( catch為關鍵字)
        3
exec呼叫系統呼叫 exec時。( exec為關鍵字,目前此功能只在 HP-UX下有用)
        4
fork呼叫系統呼叫 fork時。( fork為關鍵字,目前此功能只在 HP-UX下有用)
        5
vfork呼叫系統呼叫 vfork時。( vfork為關鍵字,目前此功能只在 HP-UX下有用)
        6
load load <libname>載入共享庫(動態連結庫)時。( load為關鍵字,目前此功能只在 HP-UX下有用)
        7
unload unload <libname>解除安裝共享庫(動態連結庫)時。( unload為關鍵字,目前此功能只在 HP-UX下有用)

    tcatch <event>
       
只設置一次捕捉點,當程式停住以後,應點被自動刪除。

四、維護停止點

上面說了如何設定程式的停止點, GDB中的停止點也就是上述的三類。在 GDB中,如果你覺得已定義好的停止點沒有用了,你可以使用 delete clear disable enable這幾個命令來進行維護。

    clear
       
清除所有的已定義的停止點。

    clear <function>
    clear <filename:function>
       
清除所有設定在函式上的停止點。

    clear <linenum>
    clear <filename:linenum>
       
清除所有設定在指定行上的停止點。

    delete [breakpoints] [range...]
       
刪除指定的斷點, breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。 range表示斷點號的範圍(如: 3-7)。其簡寫命令為 d

比刪除更好的一種方法是 disable停止點, disable了的停止點, GDB不會刪除,當你還需要時, enable即可,就好像回收站一樣。

    disable [breakpoints] [range...]
        disable
所指定的停止點, breakpoints為停止點號。如果什麼都不指定,表示 disable所有的停止點。簡寫命令是 dis.

    enable [breakpoints] [range...]
        enable
所指定的停止點, breakpoints為停止點號。

    enable [breakpoints] once range...
        enable
所指定的停止點一次,當程式停止後,該停止點馬上被 GDB自動 disable

    enable [breakpoints] delete range...
        enable
所指定的停止點一次,當程式停止後,該停止點馬上被 GDB自動刪除。

五、停止條件維護

前面在說到設定斷點時,我們提到過可以設定一個條件,當條件成立時,程式自動停止,這是一個非常強大的功能,這裡,我想專門說說這個條件的相關維護命令。一般來說,為斷點設定一個條件,我們使用 if關鍵詞,後面跟其斷點條件。並且,條件設定好後,我們可以用 condition命令來修改斷點的條件。(只有 break watch命令支援 if catch目前暫不支援 if

    condition <bnum> <expression>
       
修改斷點號為 bnum的停止條件為 expression

    condition <bnum>
       
清除斷點號為 bnum的停止條件。

還有一個比較特殊的維護命令 ignore,你可以指定程式執行時,忽略停止條件幾次。

    ignore <bnum> <count>
       
表示忽略斷點號為 bnum的停止條件 count次。

六、為停止點設定執行命令

我們可以使用 GDB提供的 command命令來設定停止點的執行命令。也就是說,當執行的程式在被停止住時,我們可以讓其自動執行一些別的命令,這很有利行自動化除錯。對基於 GDB的自動化除錯是一個強大的支援。


    commands [bnum]
    ... command-list ...
    end

為斷點號 bnum指寫一個命令列表。當程式被該斷點停住時, gdb會依次執行命令列表中的命令。

例如:

        break foo if x>0
        commands
        printf "x is %d\n",x
        continue
        end
       
斷點設定在函式 foo中,斷點條件是 x>0,如果程式被斷住後,也就是,一旦 x的值在 foo函式中大於 0 GDB會自動打印出 x的值,並繼續執行程式。

如果你要清除斷點上的命令序列,那麼只要簡單的執行一下 commands命令,並直接在打個 end就行了。


七、斷點選單

C++中,可能會重複出現同一個名字的函式若干次(函式過載),在這種情況下, break <function>不能告訴 GDB要停在哪個函式的入口。當然,你可以使用 break <function(type)>也就是把函式的引數型別告訴 GDB,以指定一個函式。否則的話, GDB會給你列出一個斷點選單供你選擇你所需要的斷點。你只要輸入你選單列表中的編號就可以了。如:

    (gdb) b String::after
    [0] cancel
    [1] all
    [2] file:String.cc; line number:867
    [3] file:String.cc; line number:860
    [4] file:String.cc; line number:875
    [5] file:String.cc; line number:853
    [6] file:String.cc; line number:846
    [7] file:String.cc; line number:735
    > 2 4 6
    Breakpoint 1 at 0xb26c: file String.cc, line 867.
    Breakpoint 2 at 0xb344: file String.cc, line 875.
    Breakpoint 3 at 0xafcc: file String.cc, line 846.
    Multiple breakpoints were set.
    Use the "delete" command to delete unwanted
     breakpoints.
    (gdb)

可見, GDB列出了所有 after的過載函式,你可以選一下列表編號就行了。 0表示放棄設定斷點, 1表示所有函式都設定斷點。


八、恢復程式執行和單步除錯

當程式被停住了,你可以用 continue命令恢復程式的執行直到程式結束,或下一個斷點到來。也可以使用 step next命令單步跟蹤程式。

    continue [ignore-count]
    c [ignore-count]
    fg [ignore-count]
       
恢復程式執行,直到程式結束,或是下一個斷點到來。 ignore-count表示忽略其後的斷點次數。 continue c fg三個命令都是一樣的意思。


    step <count>
       
單步跟蹤,如果有函式呼叫,他會進入該函式。進入函式的前提是,此函式被編譯有 debug資訊。很像 VC等工具中的 step in。後面可以加 count也可以不加,不加表示一條條地執行,加表示執行後面的 count條指令,然後再停住。

    next <count>
       
同樣單步跟蹤,如果有函式呼叫,他不會進入該函式。很像 VC等工具中的 step over。後面可以加 count也可以不加,不加表示一條條地執行,加表示執行後面的 count條指令,然後再停住。

    set step-mode
    set step-mode on
       
開啟 step-mode模式,於是,在進行單步跟蹤時,程式不會因為沒有 debug資訊而不停住。這個引數有很利於檢視機器碼。

    set step-mod off
       
關閉 step-mode模式。

    finish
       
執行程式,直到當前函式完成返回。並列印函式返回時的堆疊地址和返回值及引數值等資訊。

    until u
       
當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。

    stepi si
    nexti
ni
       
單步跟蹤一條機器指令!一條程式程式碼有可能由數條機器指令完成, stepi nexti可以單步執行機器指令。與之一樣有相同功能的命令是 “ display/i $pc ”,當執行完這個命令後,單步跟蹤會在打出程式程式碼的同時打出機器指令(也就是彙編程式碼)


九、訊號( Signals )

訊號是一種軟中斷,是一種處理非同步事件的方法。一般來說,作業系統都支援許多訊號。尤其是 UNIX,比較重要應用程式一般都會處理訊號。 UNIX定義了許多訊號,比如 SIGINT表示中斷字元訊號,也就是 Ctrl+C

相關推薦

linuxgdb除錯

用 GDB 除錯程式 GDB 概述 ———— GDB 是 GNU開源組織釋出的一個強大的 UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像 VC、 BCB等 IDE的除錯,但如果你是在 UNIX平臺下做軟體,你會發現 GDB這個除錯工具有比

設定VS201X release模式除錯

在vs Debug模式下可以對程式碼進行單步除錯,檢視結果。release模式下是否也可以進行除錯呢? 答案是:yes! 下面以vs2012為例,設定release模式進行單步除錯: 1.專案---右鍵---屬性 2.配置選擇 release 3.c/c++---常規--

gdb除錯

1 簡介 GDB(GNU Debugger)是GCC的除錯工具。其功能強大,現描述如下: GDB主要幫忙你完成下面四個方面的功能: 1.啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。 2.可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)

linux和Windows 的eclipse的安裝、配置,eclipse常用快捷鍵、eclipse斷點除錯

一、前言 什麼是eclipse?  答:Eclipse 是一個開放原始碼的、基於Java的可擴充套件開發平臺。就其本身而言,它只是一個框架和一組服務,用於通過外掛元件構建開發環境。幸運的是,Eclipse 附帶了一個標準的外掛集,包括Java開發工

linuxgdb除錯檢視原始碼

 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC、BCB的圖形化偵錯程式更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。 &nb

linux gdb+coredump 除錯偶發crash的程式

1. 開啟 core dump 檢視是否開啟 ulimit -c  如果輸出0, 說明沒有開啟。 方法一:使用命令 ulimit -c unlimited  可以開啟,但是隻對當前終端有效, 方法二: 配置 /etc/profile 檔案 su

LinuxGDB除錯簡介

Linux下C/C++除錯工具gdb簡介 GDB(GNU Debugger)是Linux下的一個除錯工具,具體的功能有: - 設定斷點,使得程式碼在制定行暫停執行; - 單步除錯程式; - 檢視

第九課 如何在Remix環境進行Solidity程式碼除錯

1. 文章摘要 【本文目標】 本文目標是指導如何使用REMIX完成一次智慧合約交易除錯。 【前置條件】 學習過Solidity語言,需要進行除錯。 【技術收穫】 1). 使用REMIX進行單步除錯 2). REMIX的Debugger介面介紹 【說明】未列出

Linuxgdb除錯

一、Linux下的gdb除錯 要使用gdb除錯,必須在原始碼生成二進位制程式時,加上-g 選項 例如:gcc -o main main.c -g 二、如何除錯 首先,先把程式碼

Linux的 ARM裸機除錯環境搭建(GDB + JLink)

說明:我也是除錯u-boot,在win下OK了,基於這裡,然後為了完全在linux下便有了下邊轉載的內容。下文會對照我自己的操作進行結果補充!感覺補充的多於轉載的就改為原創了,讓更多人看到!     一直想擺脫windows環境,在純linux下進行arm裸機開發,

關於 MonoDevelop on Linux 除錯問題的解決

在 MonoDevelop 中預設是關閉對外部程式集(.dll)的除錯,可通過如下步驟來解決這個問題。 通過選單【Edit】-【Preferences】-【Debugger】進入到偵錯程式的設定頁,把“Debug project code only; do not step into frame

(轉載)純Linux的 ARM裸機除錯環境搭建(GDB + JLink)

一直想擺脫windows環境,在純linux下進行arm裸機開發,但是由於一直不知道JLink如何在linux下執行和配置,一直無法進行下去。以前都是windows+AXD除錯。包括本人用的FL2440開發板和JLink偵錯程式也沒有提供在linux除錯的文件。前些天由於想

Java虛擬機器原理分析之Win10VS2017編譯OpenJDK8與除錯HotSpot VM過程詳細記錄

在上一篇文章《Java虛擬機器原理分析之Win7下VS2010編譯OpenJDK8與單步除錯HotSpot VM過程詳細記錄》中,我們在Win7+VS2010環境下成功編譯出了x86版本的OpenJDK。然而VS2010畢竟有些年頭了,我也只是在開發機上才裝了這

Linuxgdb除錯用法命令

一直在Fedora平臺下寫opencv的程式,需要對程式進行除錯,主要用的除錯工具是gdb. gdb提供瞭如下功能: 1.在程式中設定斷點,Debug時遇到斷點處暫停 2.可以監視某個變數,並利用print函式將該變數的值打印出來 3.程式可step-by-

linuxgdb的安裝與除錯

1 安裝gdb 在Debian GNU/Linux Desktop中,應用程式 >> 附件 >> Root Terminal。輸入密碼,在Root許可權下的終端下輸入: apt-get update …… apt-get install 

Linux嵌入式程式模擬除錯(GDB)(一)

目錄 前言 專案遇到一個問題,就是程式在Ubuntu下執行的時候是正常的,至少大部分時候執行是正常的,但是移到開發板上,就會出現段錯誤。這時候突然想到了GDB,從來都沒有接觸過除錯工具,以前的除錯都是使用printf直接列印的方式!!!效率極低!準

Linuxgdb除錯多執行緒

gdb除錯多執行緒,目前我知道的就以下幾條指令,當然編譯的時候需要加-g選項。 info threads 顯示所有執行緒,系統會給每個執行緒都分配一個編號,編號前帶“*”的,是當前正在除錯的執行緒

LINUXGDB除錯

(gdb) b *main Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17. (gdb) r The program being debugged has been started already. Start it from the beginni

linuxgdb除錯多執行緒死迴圈

1、我們首先要知道是哪個執行緒出了問題:     A、查程序  ps -ef | grep 程序名         B、查執行緒  top -H -p 程序ID 2、gdb檢視  gdb 程序名  程序號 :     A、檢視是哪個執行緒出了問題 (gdb) inf

Ubuntu Bitcoin編譯,除錯環境搭建(step by step)

為了不被時代拋棄,連一聲再見都不說。最近開始研究bitcoin,主要是對C++比較熟。學習一項新技術,為達到效果,根據個人經驗從下面三個方面入手: 1. 買一本介紹原理的書,系統的瞭解,為什麼?因為書是別人智慧的總結,是一個完整的系統知識,站在前人肩膀遠勝過網路碎片化知識。