1. 程式人生 > >使用arm-elf-gdb除錯SkyEye上執行的程式

使用arm-elf-gdb除錯SkyEye上執行的程式

我沒有使用arm-elf-gdb 使用gdb替代,也可以用,

目前skyeye-1.2.9暫時不支援gdb除錯,但是1.2.8及以前版本是支援的,因此本文以1.2.8為例說明
要使用SkeyEye除錯功能,可以在執行的時候加入-d引數,例如:
$skyeye -e hello -d
skyeye會提示
debugmode= 1, filename = skyeye.conf, server TCP port is 12345
這時就在本機的12345埠開啟了gdb服務
這時在當前目錄重新開一個終端程式
$arm-elf-gdb hello
(gdb) target remote 127.0.0.1:12345
Remote debugging using 127.0.0.1:12345 
hello () at hello.c:23
23        }
(gdb)
同時原skeyeye段給出提示
Remote debugging using host:12345
這就說明已經連線上服務,可以開始除錯了




(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 all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

下面列出常用的除錯指令:

list ---列出原始碼

如果連續輸入,則會依次列出原始碼
如果想看23行的上下文,可以使用list 23



單步執行
step 進入子函式的單步--如果在子函式中想要退出該子函式,可以使用finish命令
next 不進入子函式的單步


檢視變數
print
(gdb) print hellostr   -- 檢視字串
$2 = 0x1000078 "helloworld"
(gdb) print timeout    --檢視int變數
$3 = 1
(gdb) print hello       --檢視函式資訊
$4 = {void (void)} 0x1000020 <hello>


修改變數的值
1。顯示變數型別
(gdb) ptype timeout
type = int
(gdb) whatis timeout
type = int
2。修改變數的值
(gdb) print timeout
$5 = 2
(gdb) set timeout=5
(gdb) print timeout
$6 = 5




設定斷點


break
1。break 行數
(gdb) b 18
Breakpoint 4 at 0x1000048: file hello.c, line 18.
2。函式斷點
(gdb) break hello
Breakpoint 2 at 0x100002c: file hello.c, line 13.
3。條件斷點
(gdb) break if timeout=3
Breakpoint 1 at 0x1000044: file hello.c, line 17.
檢視斷點資訊
(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x01000044 in hello at hello.c:17
    stop only if timeout=3
2       breakpoint     keep y   0x0100002c in hello at hello.c:13
3       breakpoint     keep y   0x01000044 in hello at hello.c:17
4       breakpoint     keep y   0x01000048 in hello at hello.c:18


監視變數的值

watch 變數名   當變數的值發生變化時,程式會中斷執行
(gdb) watch timeout
Watchpoint 5: timeout
例如,設定檢測timeout後,繼續執行到while(++timeout != BOGO_MIPS);單步執行
(gdb) s
Watchpoint 5: timeout

Old value = 1
New value = 2
0x0100004c in hello () at hello.c:18
18            while(++timeout != BOGO_MIPS);
GDB會中斷程式,並將變數的變化顯示出來
檢視監測資訊:
使用info watch 檢視
(gdb) info watch
Num     Type           Disp Enb Address    What
5       watchpoint     keep y              timeout
    breakpoint already hit 1 time
可見監測點也是斷點的一種


斷點的管理
1。檢視斷點資訊
Num     Type           Disp Enb Address    What
5       watchpoint     keep y              timeout
    breakpoint already hit 1 time
6       breakpoint     keep y   0x0100002c in hello at hello.c:13
7       breakpoint     keep y   0x01000048 in hello at hello.c:18
8       breakpoint     keep y   0x0100004c in hello at hello.c:18
    stop only if timeout=4

2。刪除斷點
如果要刪除所有斷點,可使用
(gdb) delete breakpoints
刪除所有斷點嗎? (y or n) y
(gdb) info breakpoints
No breakpoints or watchpoints.
如果要刪除某一個斷點,可使用
(gdb) delete breakpoints 6
(gdb) info b
Num     Type           Disp Enb Address    What
5       watchpoint     keep y              timeout
    breakpoint already hit 1 time
7       breakpoint     keep y   0x01000048 in hello at hello.c:18
8       breakpoint     keep y   0x0100004c in hello at hello.c:18
    stop only if timeout=4

3。禁止某個斷點
(gdb) info b
Num     Type           Disp Enb Address    What
5       watchpoint     keep y              timeout
    breakpoint already hit 1 time
7       breakpoint     keep y   0x01000048 in hello at hello.c:18
8       breakpoint     keep y   0x0100004c in hello at hello.c:18
    stop only if timeout=4
(gdb) disable b 5
(gdb) info b
Num     Type           Disp Enb Address    What
5       watchpoint     keep n              timeout
    breakpoint already hit 1 time
7       breakpoint     keep y   0x01000048 in hello at hello.c:18
8       breakpoint     keep y   0x0100004c in hello at hello.c:18
    stop only if timeout=4
(gdb)
4。允許斷點
(gdb) enable b 5
(gdb) info b
Num     Type           Disp Enb Address    What
5       watchpoint     keep y              timeout
    breakpoint already hit 1 time
7       breakpoint     keep y   0x01000048 in hello at hello.c:18
8       breakpoint     keep y   0x0100004c in hello at hello.c:18
    stop only if timeout=4
(gdb)

相關推薦

使用arm-elf-gdb除錯SkyEye執行程式

我沒有使用arm-elf-gdb 使用gdb替代,也可以用, 目前skyeye-1.2.9暫時不支援gdb除錯,但是1.2.8及以前版本是支援的,因此本文以1.2.8為例說明要使用SkeyEye除錯功能,可以在執行的時候加入-d引數,例如: $skyeye -e hello

使用gdb除錯死鎖執行

1.除錯檔案 lock.c   #include <stdio.h> #include <pthread.h> #include <unistd.h> void *work_thread(void *arg) { pthread_mutex_

arm-linux-gdb除錯工具的安裝與交叉編譯gdbserver

arm-linux-gdb除錯工具的安裝與交叉編譯gdbserver 分類:嵌入式 開發環境:LPC3250 開發板:安裝linux2.6.39; 交叉編譯工具:arm-none-linux-gnueabi-gcc pc的虛擬機器:Linux version 2.6.32.

MyEclipse 執行程式報錯:Unsupported major.minor version 51.0(jdk版本錯誤)

Win10+MyEclipse10環境下,部署可執行專案原始檔,需要根據開發開發時使用的JDK版本重新引入jar包: 步驟:①在對應專案上右鍵選擇Build Path——>Configure Bulid Path…,點選Libraries,查詢並替換帶紅叉的jar包(通過Add E

GDB除錯帶有訊號的程式

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

使用GDB除錯Apollo單元測試程式

說明:本文修改後的程式碼已上傳到GitHub網站Apollo專案中。 Apollo使用Google Test框架撰寫單元測試用例。如果某個測試用例通不過,僅藉助日誌資訊,很難弄清楚詳細的失敗原因。本文介紹使用GDB除錯單元測試用例的方法,可供各位同學撰寫單元測

CMake生成可用gdb除錯的可執行檔案

CMake使用指南: 1 首先在CMakeLists.txt中加入 SET(CMAKE_BUILD_TYPE "Debug") 在下面加入: SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -W

arm-linuxgdb除錯程式,出現“Program received signal SIGPIPE, Broken pipe”

        出現這種情況大多是因為程式採用CS架構(伺服器/客戶端)在讀寫操作時出現,我第一次也是在這樣的情況下遇到的。首先我們都知道套接字的通訊方式是雙工的,同端即可寫也可讀。而出現Broken pipe這種情況的原因是寫段正在寫入時,另一端已關閉套接字,這樣程序就會向

用Qt 呼叫GDB除錯 Arm程式 詳細步驟----可單步執行每一行

前言本人交叉編譯環境 Ubuntu 10.04(虛擬機器),編譯工具鏈 arm-hisiv100nptl-linux,Qt 4.8.5 ,QtCreator1.3.11、在虛擬機器Ubuntu 10.04上,安裝GDB除錯工具之前,要安裝預處理模組:sudo apt-get

使用gdb除錯正在執行程式

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

gdb除錯當前執行程式

為什麼使用gdb除錯正在執行的程式?      因為有時候bug很難復現、或者環境搭建起來比較困難,所以在出現bug的時候可以使用gdb的attach功能除錯正在執行的GCC編譯出來的程式,注意編譯選項要加-g,否則沒有符號表。 除錯步驟?      1. 編譯時

GDB除錯正在執行程式

      有時會遇到一種很特殊的除錯需求,對當前正在執行的其它程序進行除錯(正是我今天遇到的情形)。這種情況有可能發生在那些無法直接在偵錯程式中執行的程序身上,例如有的程序 只能在系統啟動時執行。另外如果需要對程序產生的子程序進行除錯的話,也只能採用這種方式。GDB可以

使用gdb除錯當前執行程式

用gdb可以除錯當前的程式的使用情況,讀出他的引數。 以下用一個簡單的程式做為例子:來說明gdb的除錯。第一步  編譯一個死迴圈程式。 /* File name malloc.c*/ #include   <stdio.h>                    

ARM開發板的嵌入式linux系統執行的QT程式,必須得要在linux裡用QT編嗎

最近在做有關嵌入式的東西,很多不懂。 1、想在板子上執行用QT編好的程式,必須要在PC的linux系統裡用QT編嗎? 2、在windows系統裡編好的QT程式,經過交叉編譯後能直接執行在板子上嗎?還是板子需要弄個QT環境啥的?就是往裡面安個相同版本的QT? 謝謝。。。。。

使用gdb除錯執行緒多程序程式

GDB的基本介紹 GDB是GUN開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,平時大家更加習慣圖形介面的除錯,比如VS上的IDE除錯;但是如果我們在UNIX或Linux下做軟體,我們呢就更加需要熟練GDB這個除錯工具。 一般來說,GDB主要能夠完成以下的幾個功能: ①啟動你的程式,可以按照你自己

交叉編譯能在arm平臺執行的Qt應用程式的步驟

        我們的電腦一般來說,現在主流的還是X86平臺(當然,隨著64位機的普及,相信以後格局會變化,暫不討論)。對於Qt應用程式來說,我們在PC機上開發的時候,因為本身我們的開發軟體Qt creator是執行在X86平臺上的,而我們編寫的應用程式也預設是在PC機上執

如何在ARM開發板的嵌入式linux系統執行的QT程式

最近在做有關嵌入式的東西,很多不懂。 1、想在板子上執行用QT編好的程式,必須要在PC的linux系統裡用QT編嗎? 2、在windows系統裡編好的QT程式,經過交叉編譯後能直接執行在板子上嗎?還是板子需要弄個QT環境啥的?就是往裡面安個相同版本的QT? 謝謝。。。。。

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 P

QT程式,如何在ARM執行

寫這篇文章,主要是為了說明怎麼讓PC機下編譯好的QT程式移植到板子上執行。在說明之前,我們要了解一個事情,就是QT。QT是一個跨平臺的開發工具,具有很好的移植性,它所依賴的庫檔案在PC機上和在ARM上是不一樣的,那麼我要怎麼做呢?很簡單,就是重新編譯已經寫好的QT程式。為什麼需要重新編譯,第一,ARM的CPU

安裝交叉編譯工具arm-none-linux-gnueabi-gcc——Linux編譯在android執行的c程式

# vim /etc/bash.bashrc 在最後新增 PATH=$PATH:/usr/local/arm-2014.05/bin source /etc/bash.bashrc 使其立刻生效 開啟另一個終端 執行 arm-none-linux-gnueabi-gcc -v,顯示版本即說明安裝成功 方法二