【Linux】GDB調試指南

一、GDB基礎?

1.?啟動調試

gdb ./your_program       # 啟動調試
gdb --args ./prog arg1   # 帶參數啟動
gdb -p <pid>             # 附加到正在運行的進程

?2.?斷點管理

b main            # 在main函數設斷點
b file.c:20       # 在file.c第20行設斷點
b *0x4005a0       # 在內存地址設斷點
info breakpoints  # 查看所有斷點
delete <num>      # 刪除斷點
disable/enable <num> # 禁用/啟用斷點
3.?執行控制
run               # 啟動程序
continue (c)      # 繼續執行到下一個斷點
next (n)          # 單步執行(跳過函數)
step (s)          # 單步進入函數
finish            # 執行完當前函數并返回
until <line>      # 執行到指定行

?4.?查看變量和內存

print (p) x       # 打印變量x
p *ptr@10         # 打印ptr指向的10個元素
p/x var           # 十六進制格式打印
x/4xg 0x4000      # 查看內存:4個8字節十六進制值
info registers    # 查看寄存器值

二、GDB進階?

1.?加載可執行程序和core dump文件

#include <stdio.h>int main(void) {int *p = NULL;printf("hello world\n");*p = 0;return 0;
}

例子程序訪問了一個空指針,所以程序會crash并產生core dump文件。用gdb調試core dump文件,通常用這個命令形式:

gdb path/to/the/executable path/to/the/coredump

然后gdb會顯示程序crash的位置。

2.?調試正在運行的進程

# 查找目標進程PID
ps aux | grep 程序名# 附加調試
gdb -p <PID>
(gdb) bt                 # 查看當前調用棧
(gdb) info threads       # 查看所有線程
(gdb) thread <ID>        # 切換線程
(gdb) frame <N>          # 選擇棧幀
(gdb) p variable         # 打印變量

三、其他問題?

1. 怎么debug,怎么看內存泄漏。

2. gdb 使用 -> 多線程程序切換到某線程棧幀 -> 如何查看寄存器值

# 在malloc/free處設斷點
(gdb) break malloc
(gdb) break free# 記錄所有內存分配
(gdb) set logging file mem.log
(gdb) set logging on# 運行后對比malloc/free調用次數
(gdb) info breakpoints

3. 怎么分析C++的core文件

啟用core dump生成:

# 臨時生效(當前會話)
ulimit -c unlimited  # 解除大小限制
echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern  # 設置存儲路徑# 永久生效(需root)
echo "ulimit -c unlimited" >> /etc/profile
echo "/tmp/core.%e.%p" > /etc/sysctl.d/core.conf
sysctl -p /etc/sysctl.d/core.conf
g++ -g -O0 -rdynamic -o program program.cpp  # 必須包含-g選項

?加載core文件

gdb ./program /tmp/core.1234  # program是崩潰的可執行文件

查看崩潰位置:

(gdb) bt full  # 顯示完整調用棧(包含局部變量)
(gdb) frame N  # 切換到指定棧幀(N為bt顯示的編號)
(gdb) list     # 顯示崩潰點附近的源代碼

?

4. GDB有哪些命令

1.?啟動與退出
命令說明
gdb ./program啟動GDB調試程序
run [args]運行程序(可帶參數)
quit退出GDB
2.?斷點管理
命令說明
break main在main函數設斷點
break file.cpp:20在指定文件的第20行設斷點
break *0x4005a0在內存地址設斷點
info breakpoints查看所有斷點
delete 2刪除編號為2的斷點
disable/enable 1禁用/啟用編號1的斷點
3.?執行控制
命令說明
next?(n)單步執行(不進入函數)
step?(s)單步進入函數
continue?(c)繼續執行到下一個斷點
finish執行完當前函數并暫停
until 30運行到第30行
4. 變量與內存
命令說明
print x打印變量x的值
print *ptr@10打印指針ptr指向的10個元素
x/4xw 0x4000以16進制顯示內存(4個word)
info registers查看所有寄存器值
info locals顯示當前棧幀的局部變量
5.?調用棧與線程
命令說明
backtrace?(bt)查看調用棧
frame 2切換到調用棧第2幀
info threads查看所有線程
thread 3切換到線程3
?6.?多進程/線程調試
命令說明
set follow-fork-mode child調試子進程
set scheduler-locking on鎖定當前線程
thread apply all bt打印所有線程的調用棧
7. 實用輔助命令
命令說明
set logging on記錄調試輸出到文件
define hook-run定義啟動時自動執行的命令
shell ls執行shell命令
help [command]查看命令幫助

?

5. gcc和g++的區別

特性gcc?(GNU C Compiler)g++?(GNU C++ Compiler)
默認語言標準C11 (可通過?-std=?指定其他版本)C++17 (可通過?-std=?指定其他版本)
鏈接階段行為默認不鏈接 C++ 標準庫自動鏈接?libstdc++?(C++ 標準庫)
文件擴展名處理將?.c?文件視為 C 代碼將?.cpp/.cxx?視為 C++,.c?仍視為 C

6. Linux下程序有問題,如何調試?(答GDB打開,打上Breakpoint進行調試)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75995.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75995.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75995.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android面試總結之Glide源碼級理解

當你的圖片列表在低端機上白屏3秒、高端機因內存浪費導致FPS腰斬時&#xff0c;根源往往藏在Glide的內存分配僵化、磁盤混存、網絡加載無優先級三大致命缺陷中。 本文從阿里P8級緩存改造方案出發&#xff0c;結合Glide源碼實現動態內存擴容、磁盤冷熱分區、智能預加載等黑科技&…

驅動開發系列49 - 搭建 Vulkan 驅動調試環境(編譯 mesa 3D)- Ubuntu24.04

一:搭建Vulkan運行環境 安裝vulkan依賴包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…

深度學習——圖像余弦相似度

計算機視覺是研究圖像的學問&#xff0c;在圖像的最終評價時&#xff0c;往往需要用到一些圖像相似度的度量指標&#xff0c;因此&#xff0c;在本文中我們將詳細地介紹原生和調用第三方庫的計算圖像余弦相似度的方法。 使用原生numpy實現 import numpy as npdef image_cosin…

項目代碼第8講【數據庫基礎知識】:SQL(DDL、DML、DQL、DCL);函數(聚合、字符串、數值、日期、流程);約束;多表查詢;事務

黑馬程序員 MySQL數據庫入門到精通&#xff0c;從mysql安裝到mysql高級、mysql優化全囊括_嗶哩嗶哩_bilibili 一、數據庫相關概念 1、主流的關系型數據庫都支持SQL語言——SQL語言可以操作所有的關系型數據庫 像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的…

如何在阿里云linux主機上部署Node.Js

在阿里云的Linux服務器上搭建Node.js編程環境可以通過以下步驟完成。這里以常見的 Ubuntu/CentOS 系統為例&#xff0c;提供兩種安裝方式&#xff08;包管理器、NVM多版本管理&#xff09;&#xff1a; 一、通過包管理器安裝&#xff08;適合快速安裝指定版本&#xff09; 1. …

Python爬蟲:開啟數據抓取的奇幻之旅(一)

目錄 一、爬蟲初印象&#xff1a;揭開神秘面紗? 二、工欲善其事&#xff1a;前期準備? &#xff08;一&#xff09;Python 環境搭建? 1.下載 Python 安裝包&#xff1a;? 2.運行安裝程序&#xff1a;? 3.配置環境變量&#xff08;若自動添加失敗&#xff09;&#x…

機器學習——集成學習框架(GBDT、XGBoost、LightGBM、CatBoost)、調參方法

一、集成學習框架 對訓練樣本較少的結構化數據領域&#xff0c;Boosting算法仍然是常用項 XGBoost、CatBoost和LightGBM都是以決策樹為基礎的集成學習框架 三個學習框架的發展是&#xff1a;XGBoost是在GBDT的基礎上優化而來&#xff0c;CatBoost和LightGBM是在XGBoost的基礎上…

第十五章:Python的Pandas庫詳解及常見用法

在數據分析領域&#xff0c;Python的Pandas庫是一個不可或缺的工具。它提供了高效的數據結構和數據分析工具&#xff0c;使得數據處理變得簡單而直觀。本文將詳細介紹Pandas庫的基本功能、常見用法&#xff0c;并通過示例代碼演示如何使用Pandas進行數據處理。最后&#xff0c;…

【Python桌面應用】PySide6 界面開發完全指南

文章目錄 1. 引言2. PySide6 簡介與安裝2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安裝PySide62.4 開發環境配置建議 3. Qt 設計原理3.1 Qt對象模型3.2 信號與槽機制3.3 Qt坐標系統3.4 Qt樣式表(QSS) 4. 創建第一個應用4.1 基本應用結構4.2 主窗口與應用生命周期4.3 使用面向…

用 pytorch 從零開始創建大語言模型(三):編碼注意力機制

從零開始創建大語言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;編碼注意力機制 3 編碼注意力機制3.1 建模長序列的問題3.2 使用注意力機制捕捉數據依賴關系3.3 通過自注意力關注輸入的不同部分3.3.1 一個沒有可訓練權重的簡化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的兩大核心設計思想是 IOC&#xff08;控制反轉&#xff09; 和 AOP&#xff08;面向切面編程&#xff09;。它們共同解決了代碼耦合度高、重復邏輯冗余等問題。 IOC&#xff08;控制反轉&#xff09; 1.核心概念 控制反轉&#xff08;Inversion of Control…

STM32_HAL開發環境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安裝Keil(MDK-ARM)【集成開發環境IDE】 我們會在Keil(MDK-ARM)上去編寫代碼、編譯代碼、燒寫代碼、調試代碼。 Keil(MDK-ARM)的安裝方法&#xff1a; 教學視頻的第02分03秒開始看。 安裝過程中請修改一下下面兩個路徑&#xff0c;避免占用C盤空間。 Core就是Keil(MDK-ARM)的…

python 第三方庫 - dotenv讀取配置文件

.env 文件是一種用于存儲環境變量的配置文件&#xff0c;常用于項目的運行環境設置。環境變量是操作系統層面的一些變量&#xff0c;它們可以被應用程序訪問和使用&#xff0c;通常包含敏感信息或特定于環境的配置&#xff0c;如數據庫連接信息、API 密鑰、調試模式等。 安裝p…

用python壓縮圖片大小

下載庫 cmd開命令或者PyCharm執行都行 pip install pillow2. 然后就是代碼 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""壓縮圖片大小。參數:- input_path: 輸入圖片路徑- output_path: 輸出圖片路徑- qu…

【自用記錄】本地關聯GitHub以及遇到的問題

最近終于又想起GitHub&#xff0c;想上傳代碼和項目到倉庫里。 由于很早之前有在本地連接過GitHub&#xff08;但沒怎么用&#xff09;&#xff0c;現在需要重新搞起&#xff08;操作忘得差不多&#xff09;。 在看教程實操的過程中遇到了一些小問題&#xff0c;遂記錄一下。 前…

在一個scss文件中定義變量,在另一個scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅 許久未曾更新這個系列&#xff0c;并非我平日里對這事兒沒了興致&#xff0c;不再愿意折騰。實則是受限于自身條…

智能駕駛功能LCC車道保持居中

畫龍現象就是LCC常見bug LDW車道偏離預警 LKA車道保持 聲音其實就是蜂鳴器 有些車是40 有些是60

Java全棧面試寶典:線程機制與Spring依賴注入深度解析

目錄 一、Java線程核心機制 &#x1f525; 問題3&#xff1a;start()與run()的底層執行差異 線程啟動流程圖解 核心差異對照表 代碼驗證示例 &#x1f525; 問題4&#xff1a;Thread與Runnable的六大維度對比 類關系UML圖 最佳實踐代碼 &#x1f525; 問題5&#xff1…

使用ANTLR4解析Yaml,JSON和Latex

文章目錄 ANTLR4基本使用**1. 安裝 Java 運行時&#xff08;必需&#xff09;****2. 安裝 ANTLR4 命令行工具****方法一&#xff1a;通過包管理器&#xff08;推薦&#xff09;****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二&#xff1a;手動安裝&#xff08;…