1. 程式人生 > >Linux下嵌入式程式模擬除錯(GDB)(一)

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

目錄

前言

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

GDB

除錯工具介紹

linux下的程式除錯方法彙總,這篇文章中介紹了linux下除錯的常用方法。

GDB除錯教程

GDB是一個由GNU開源組織釋出的、UNIX/Linux作業系統下的、基於命令列的、功能強大的程式除錯工具。這篇文章GDB十分鐘教程,介紹了GDB除錯程式的大體流程。
程式的除錯過程主要有:單步執行,跳入函式,跳出函式,設定斷點,設定觀察點,檢視變數。

gcc除錯相關編譯選項

  • -g
    gdb主要除錯的是C/C++程式。要除錯C/C++程式,首先在編譯時,必須要把除錯資訊加到可執行檔案中,使用編譯器(cc/gcc/g++)的-g引數即可。

GDB交叉除錯環境搭建

嵌入式Linux的GDB除錯環境由Host端(PC機)和Target端(ARM)兩部分組成,Host端使用arm-linux-gdb除錯工具,而Target端需要執行gdbserver,兩者之間可通過串列埠或者網口連線,把ARM應用程式在Target端的執行情況返回Host。除錯跟蹤命令從Host端的arm-linux-gdb中發出。搭建交叉除錯環境 arm-linux-gdb配合gdbserver

下載地址

編譯過程

  • gdb的編譯過程
// 建立gdb放置的目錄
mkdir arm-gdb
// 解壓
tar -xvf gdb-8.1.tar.gz
// 配置
./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --prefix=/xxx/arm-gdb CC=arm-linux-gnueabihf-gcc
// 編譯、安裝
make -j4
make install
  • gdbserver編譯過程
cd /xxx/gdb-
8.1/gdb/gdbserver // 配置 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc // 編譯 make // 注意:不需要make install // 去除符號資訊 arm-linux-gnueabihf-strip gdbserver -o gdbserver

使用方法

  • 第一步:nfs方式實現PC和開發板之間的互通
    nfs掛載命令示例:
mount -t nfs 192.168.1.95:/nfs /opt -o nolock
  • 第二步:Ubuntu下交叉編譯測試程式
arm-linux-gnueabihf-g++ -g helloWorld.cpp -o helloWorld
// 注意:要加-g引數才能進行除錯
  • 第三步:拷貝gdbserver到/opt目錄下(此處是博主的nfs掛載目錄)
  • 第四步:拷貝測試程式/opt目錄下
    可以現在開發板上執行這個程式,看是否可以執行成功。交叉編譯命令示例:
arm-linux-gnueabihf-g++ -g helloWorld.cpp -o helloWorld
  • 第五步:gdbserver使用方法
    格式:gdbserver 開發板ip地址:通訊埠(自己設定) 測試程式 【命令列引數】
    舉例如下:
gdbserver 192.168.1.90:20 helloWorld
// 192.168.1.90是開發板地址
// 20是埠號
// helloWorld是測試程式

列印資訊如下:

Process helloWorld created; pid = 1999
Listening on port 20
  • 第六步:Ubuntu下啟動arm-linux-gnueabihf-gdb
arm-linux-gnueabihf-gdb helloWorld

注意:如果要直接這樣使用arm-linux-gnueabihf-gdb,需要設定環境變數,示例如下:

export PATH=$PATH:/xxx/arm-gdb/bin

列印資訊如下:

Copyright (C) 2013 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 "--host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf".
For bug reporting instructions, please see:
<https://bugs.launchpad.net/gcc-linaro>...
Reading symbols from /nfs/helloWorld...done.
(gdb)

注意:列印最後進入了gdb的除錯環境:(gdb)
- 第七步:遠端連線開發板埠
(gdb)target remote 192.168.1.90:20
Ubuntu列印資訊如下:

Remote debugging using 192.168.1.90:20
Reading symbols from /opt/arm-4.9-toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3...done.
Loaded symbols for /opt/arm-4.9-toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3
0xb6fd7a40 in _start () from /opt/arm-4.9-toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3

開發板列印資訊如下:

Remote debugging from host 192.168.1.95

完成上面的7步之後,就可以使用GDB對開發板程式進行除錯了。

總結

雖然交叉編譯GDB的庫的過程很順利,但是中途發現大部分部落格的引數都是-host=arm-linux,沒有經過思考就胡亂編譯,後來才改對。應該來說,gdb可以算是交叉編譯工具鏈的一個工具,只是在交叉編譯工具鏈中可能不包含這一部分,所以需要交叉編譯gdb的庫,最終得到arm-linux-gnueabihf-gdb這要的除錯工具。

連結地址

相關推薦

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

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

linux elasticsearch的安裝和配置

1. 安裝地址 https://www.elastic.co/products/elasticsearch 2. 使用 xshell 將壓縮包上傳到linux上,解壓elasticsearch-5.6.1.tar.gz到/home目錄下。 切記不要放在root目錄下 3

linux移植wifi之概念介紹

詳細介紹linux下移植wifi的步驟.docx 目錄 Linux系統下移植wifi模組,使其正常工作。包括兩部分內容,第一部分是識別無線裝置,並且正確安裝驅動程式。第二部分是選擇管理無線連線的方法。本文將介紹這兩部分內容。一、   背景配置w

基於linux的shell中常用語句

常用的語句 exit直接退出 break退出當前迴圈,不影響其他 continue跳出本層迴圈,進入下一次迴圈 [[email protected] mnt]# vim test.sh #!/bin/bash for NUM in {1..5} do        

linuxC語言多執行緒執行緒的建立與取消

#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void

Linux驅動開發除錯技術

驅動程式開發的一個重大難點就是不易除錯。本文目的就是介紹驅動開發中常用的幾種直接和間接的除錯手段,它們是:     使用printk     檢視OOP訊息     使用strace     使用核心內建的hacking選項     使用ioctl方法     使用/proc 檔案系統     使用

linux使用者程式同核心通訊例項netlink

linux下使用者程式同核心通訊的方式一般有ioctl, proc檔案系統,剩下一個就是Netlink套接字了。 這裡先介紹下netlink。 先抄一段前輩對這幾種通訊方式的比較: Netlink 是一種在核心與使用者應用間進行雙向資料傳輸的非常好的方式,使用者態應

Linux批量修改文件名rename

批量修改 rename1.rename命令批量修改文件名, 其實Linux下可以使用別的辦法來批量修改文件名, 不過rename實在太方便了比如把所有的表為cdb1_* 修改為cdb_*的在本目錄下只需要# rename ‘cdb1‘ ‘cdb‘ *以前都是寫個for循環來做...想想多傻啊, 呵呵ren

linuxmysql多實例安裝

ont 數據庫 fill 行修改 安裝部署 file 常見 soc -s 轉自:http://www.cnblogs.com/xuchenliang/p/6843990.html 1.MySQL多實例介紹 1.1.什麽是MySQL多實例 MySQL多實例就是在一臺機器上

LinuxMySQL的安裝和啟動轉載

enable linu char cal mysql用戶 客戶端程序 ast 初學 unix 原文鏈接:http://www.linuxidc.com/Linux/2016-07/133234.htm 一、MySQL各類安裝方法的比較 在Linux系統下,MySQL有3種主

Linux網路socket程式設計——實現伺服器select與多個客戶端通訊

Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多

Linuxbind提供的快取記憶體企業級

快取記憶體 1.我們先讓虛擬機器server可以上網 1.讓真機當路由器,開啟真機火牆,開啟偽裝服務,看火牆協議是否為1 2.配置虛擬機器server的網路配置,設定server的閘道器為真機的ip 3.我們用server ping www.baidu.com 可以ping通 2.

LinuxApache服務的基本設定企業級

Apache Apache是世界使用排名第一的Web伺服器軟體。它可以執行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python等直譯器編譯到伺服器中。同時Apache音譯為阿帕

linux Redis 5.0主從複製主二從的搭建

文件結構如下:   一、環境說明: 作用 IP地址 埠 作業系統版本 安裝目錄 主庫 172.16.10.80 6379 Redhat 6.7

dns的遞迴和迭代查詢及linuxdns主從關係的部署推薦

什麼是dns dns存在的意義 dns解析的過程及原理 dns主從關係的部署 什麼是dns Domain Name Server的縮寫,就是域名伺服器的意思,域名包括域名伺服器和域名解析器,域名是什麼呢?我們平時在瀏覽器中輸入的baidu.com就

Linux安裝Adobe Flash Player外掛Firefox

Linux系統上用火狐瀏覽器看視訊的時候發現沒有安裝adobe flash player外掛,無法播放視訊。想看得話還得在Linux和Windows間切換。簡單幾步安裝外掛,就可以使用linux系統看視訊了 第一步: 開啟視訊,點選flash外掛圖示(也就是安裝或更新外掛),會出現如下介面

LinuxC++呼叫Java簡單例項jni

假設工作目錄為/home1. Java端1)  mkdir leixf && cd leixf2) 建立SubClass.java檔案,內容如下:package leixf;public class SubClass {private String name

linux搭建nginx+uwsgi+django環境)

nginx是什麼? uwsgi是什麼? django又是什麼? 不做過多的解釋,有不明白的朋友們自行學習吧。此篇只講環境搭建及解決環境搭建過程中遇到的問題。 作業系統:centos 7 登入使用者:root 第一步,安裝python     本例中使用的是d

Linux套接字詳解---epoll模式的IO多路複用伺服器

1 epoll模型簡介 epoll可是當前在Linux下開發大規模併發網路程式的熱門人選,epoll 在Linux2.6核心中正式引入,和select相似,其實都I/O多路複用技術而已,並沒有什麼神祕的。 其實在Linux下設計併發網路程式,向來不缺少

gdb除錯學習 list命令的學習

———-l(list)命令用於列出原始碼 tst.c原始碼 #include <stdio.h> int Sum(int n) { int sum = 0; int i