C語言中常用的調試宏和函數總結(__LINE__、__FUNCTION__)

表格:C語言調試工具

類別工具描述示例代碼
預定義宏__LINE__表示當前源代碼的行號。printf("Error occurred at line %d\n", __LINE__);
__FILE__表示當前源代碼文件的名稱。printf("Error occurred in file %s\n", __FILE__);
__func__表示當前函數的名稱。printf("Current function: %s\n", __func__);
__DATE__表示源代碼文件的編譯日期。printf("Compiled on: %s\n", __DATE__);
__TIME__表示源代碼文件的編譯時間。printf("Compiled at: %s\n", __TIME__);
標準輸入輸出printf格式化輸出函數,用于在標準輸出設備上顯示信息。printf("Debug message: %d\n", variable);
fprintf格式化輸出函數,用于將信息輸出到指定的文件。fprintf(stderr, "Error: %s\n", error_message);
斷言函數assert在條件不滿足時終止程序并輸出錯誤信息。assert(x == 5);
錯誤處理函數perror輸出與錯誤相關的消息。perror("Error opening file");
exit終止程序的執行,并返回一個狀態碼。exit(EXIT_FAILURE);
內存管理函數malloc用于動態內存分配。int* ptr = malloc(sizeof(int) * 10);
calloc用于動態內存分配并初始化為零。int* ptr = calloc(10, sizeof(int));
free用于釋放動態分配的內存。free(ptr);
調試器GDBGNU調試器,用于設置斷點、單步執行和查看變量值。gdb ./my_program
日志打印自定義日志函數在關鍵位置插入printffprintf語句,輸出程序的執行狀態和變量值。printf("Entering function %s\n", __func__);
條件編譯#ifdef?和?#endif用于控制調試代碼的編譯。#ifdef DEBUG printf("Debug mode enabled.\n"); #endif

詳細解釋與示例
1. 預定義宏
1.1?__LINE__
  • 描述:返回當前源代碼的行號。
  • 示例
printf("Current line: %d\n", __LINE__);
  • 輸出
Current line: 10
1.2?__FILE__
  • 描述:返回當前源代碼文件的名稱。
  • 示例
printf("Current file: %s\n", __FILE__);
  • 輸出
Current file: main.c
1.3?__func__
  • 描述:返回當前函數的名稱。
  • 示例
void debug_info() 
{ printf("Current function: %s\n", __func__);
}
  • 輸出
Current function: debug_info
1.4?__DATE__?和?__TIME__
  • 描述:分別返回源代碼文件的編譯日期和時間。
  • 示例
printf("Compiled on: %s at %s\n", __DATE__, __TIME__);
  • 輸出
Compiled on: Sep 4 2024 at 14:30:22
2. 標準輸入輸出函數
2.1?printf
  • 描述:格式化輸出函數,用于在標準輸出設備上顯示信息。
  • 示例
int num = 42; printf("The value of num is: %d\n", num);
  • 輸出
The value of num is: 42
2.2?fprintf
  • 描述:格式化輸出函數,用于將信息輸出到指定的文件。
  • 示例
FILE* log_file = fopen("debug.log", "w"); 
if (log_file != NULL) 
{ fprintf(log_file, "Debug message: %s\n", "Program started");fclose(log_file);
}
  • 文件內容
Debug message: Program started
3. 斷言函數
3.1?assert
  • 描述:在條件不滿足時終止程序并輸出錯誤信息。
  • 示例
#include <assert.h> 
int x = 5; 
assert(x == 5); // 條件滿足,程序繼續運行 
assert(x == 6); // 條件不滿足,程序終止并輸出錯誤信息
  • 輸出
Assertion failed: x == 6, function main, file main.c, line 15.
4. 錯誤處理函數
4.1?perror
  • 描述:輸出與錯誤相關的消息。
  • 示例
#include <errno.h> 
#include <stdio.h> 
FILE* file = fopen("nonexistent.txt", "r"); 
if (file == NULL) 
{ perror("Error opening file"); 
}
  • 輸出
Error opening file: No such file or directory
4.2?exit
  • 描述:終止程序的執行,并返回一個狀態碼。
  • 示例
#include <stdlib.h> 
if (error_condition) 
{ printf("Error occurred. Exiting...\n"); exit(EXIT_FAILURE); 
}
  • 輸出
Error occurred. Exiting...
5. 內存管理函數
5.1?malloc
  • 描述:用于動態內存分配。
  • 示例
int* ptr = malloc(sizeof(int) * 10); 
if (ptr == NULL) 
{ printf("Memory allocation failed.\n"); exit(EXIT_FAILURE); 
} // 使用 ptr... free(ptr);
5.2?calloc
  • 描述:用于動態內存分配并初始化為零。
  • 示例
int* ptr = calloc(10, sizeof(int)); 
if (ptr == NULL) 
{ printf("Memory allocation failed.\n"); exit(EXIT_FAILURE); 
} // 使用 ptr... free(ptr);
6. 調試器
6.1?GDB
  • 描述:GNU調試器,用于設置斷點、單步執行和查看變量值。
  • 示例
  • gdb ./my_program
  • 在GDB提示符下,可以輸入以下命令:
    • break main:在main函數處設置斷點。
    • run:啟動程序。
    • next:單步執行。
    • print variable:查看變量值。
7. 日志打印
7.1 自定義日志函數
  • 描述:在關鍵位置插入printffprintf語句,輸出程序的執行狀態和變量值。
  • 示例
void my_function() 
{ printf("Entering function %s\n", __func__); // 函數體... printf("Exiting function %s\n", __func__); 
}
8. 條件編譯
8.1?#ifdef?和?#endif
  • 描述:用于控制調試代碼的編譯。
  • 示例
#define DEBUG 
#ifdef DEBUG printf("Debug mode enabled.\n"); #endif

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

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

相關文章

DotnetCore開源庫SampleAdmin源碼編譯

1.報錯: System.Net.Sockets.SocketException HResult0x80004005 Message由于目標計算機積極拒絕&#xff0c;無法連接。 SourceSystem.Net.Sockets StackTrace: 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, C…

如何使用切片操作來處理序列數據

1 問題 本文主要探究 Python 中切片操作的原理和應用。具體來說&#xff0c;我們將分析切片的基本語法、切片的步長和切片的邊界&#xff0c;并通過示例代碼展示如何使用切片操作來處理序列數據。 2 方法 為了更好地理解切片操作&#xff0c;我們采用如下的思路學習python中的切…

java(二):java的運算和流程控制

java中單引號和雙引號區別和用法 區別1&#xff1a;java中的單引號表示字符&#xff0c;雙引號表示字符串。 區別2&#xff1a;單引號引的數據一般是char類型的&#xff1b;雙引號引的數據 是String類型的。 區別3&#xff1a;java中單引號里面只能放一個字母或數字或符號&…

Android envsetup與Python venv使用指南

Android envsetup 和 Python venv 是兩種完全不同的環境配置工具&#xff0c;分別服務于不同的開發場景。以下是對它們的詳細解釋及使用方法&#xff1a; 1. Android envsetup 用途&#xff1a; Android envsetup 是 Android 源碼開發中的環境配置腳本&#xff08;envsetup.sh…

游戲引擎學習第222天

回顧昨天的過場動畫工作 我們正在制作一個游戲&#xff0c;目標是通過直播的方式完成整個游戲的開發。在昨天的工作中&#xff0c;我享受了制作過場動畫的過程&#xff0c;所以今天我決定繼續制作多個層次的過場動畫。 昨天我們已經開始了多層次過場動畫的基本制作&#xff0…

Leedcode刷題 | Day31_貪心算法05

一、學習任務 56. 合并區間代碼隨想錄738. 單調遞增的數字968. 監控二叉樹 二、具體題目 1.56合并區間56. 合并區間 - 力扣&#xff08;LeetCode&#xff09; 給出一個區間的集合&#xff0c;請合并所有重疊的區間。 示例 1: 輸入: intervals [[1,3],[2,6],[8,10],[15,1…

app逆向專題五:新快報app數據采集

app逆向專題五:新快報app數據采集 一、抓包尋找數據接口二、編寫代碼三、完整代碼一、抓包尋找數據接口 打開charles,并在手機端打開新快報app,點擊“廣州”或者“經濟”等選項卡,抓包,尋找數據接口,如圖所示: 二、編寫代碼 這里介紹一種簡便的代碼編寫方法,在數據…

Java面試黃金寶典45

1. 非對稱加密 RSA 定義:RSA 是一種廣泛使用的非對稱加密算法,其安全性基于大整數分解的困難性。它使用一對密鑰,即公鑰和私鑰。公鑰可公開用于加密消息,而私鑰必須保密,用于解密由相應公鑰加密的消息。要點: 公鑰公開,私鑰保密,二者成對出現。加密和解密使用不同的密鑰…

提權實戰!

就是提升權限&#xff0c;當我們拿到一個shell權限較低&#xff0c;當滿足MySQL提權的要求時&#xff0c;就可以進行這個提權。 MySQL數據庫提權&#xff08;Privilege Escalation&#xff09;是指攻擊者通過技術手段&#xff0c;從低權限的數據庫用戶提升到更高權限&#xff…

在虛擬機上修改saprk的版本

之前安裝的spark版本是3.4&#xff0c;現在實驗需要的版本是2.4。現在需要更改spark的版本。 方法很簡單&#xff1a; 直接將原有的spark3.4的文件刪除&#xff0c;再安裝2.4版本。 安裝過程之后再寫。Spark2.1.0入門&#xff1a;Spark的安裝和使用_廈大數據庫實驗室博客

文獻分享: DESSERT基于LSH的多向量檢索(Part3.2.外部聚合的聯合界)

原論文 文章目錄 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的內容 1.1. \textbf{1.1. } 1.1. 一些符號 1.2. \textbf{1.2. } 1.2. 定理內容 3. \textbf{3. } 3. 聯合界限 Ps. \textbf{Ps. } Ps. 運行時間分析 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的內容 1.1. \t…

MIPI協議介紹

MIPI協議介紹 mipi 協議分為 CSI 和DSI,兩者的區別在于 CSI用于接收sensor數據流 DSI用于連接顯示屏 csi分類 csi 分為 csi2 和 csi3 csi2根據物理層分為 c-phy 和 d-phy, csi-3采用的是m-phy 一般采用csi2 c-phy 和 d-phy的區別 d-phy的時鐘線和數據線是分開的,2根線一對…

【中間件】nginx反向代理實操

一、說明 nginx用于做反向代理&#xff0c;其目標是將瀏覽器中的請求進行轉發&#xff0c;應用場景如下&#xff1a; 說明&#xff1a; 1、用戶在瀏覽器中發送請求 2、nginx監聽到瀏覽器中的請求時&#xff0c;將該請求轉發到網關 3、網關再將請求轉發至對應服務 二、具體操作…

在3ds Max中視口顯示為黑色或深灰色

在3ds Max中視口顯示為黑色或深灰色 Autodesk Support 2023年10月8日 涵蓋的產品和版本 問題&#xff1a; 在3ds Max中&#xff0c;使用“深”UI方案時視口顯示為完全黑色&#xff0c;使用“淺”UI方案時視口顯示為深灰色。 原因&#xff1a; 已為用戶界面禁用Gamma校正。…

Vue.js 中 v-if 的使用及其原理

在 Vue.js 的開發過程中&#xff0c;條件渲染是一項極為常見的需求。v-if指令作為 Vue.js 實現條件渲染的關鍵手段&#xff0c;能夠根據表達式的真假來決定是否渲染某一塊 DOM 元素。它在優化頁面展示邏輯、提升用戶體驗等方面發揮著重要作用。接下來&#xff0c;我們就深入探討…

Verilog:LED呼吸燈

模塊接口說明 信號方向描述clk輸入系統時鐘&#xff08;100MHz&#xff0c;周期10ns&#xff09;rst_n輸入低電平有效的異步復位信號led_en輸入總使能信號&#xff08;1開啟呼吸燈&#xff0c;0關閉&#xff09;speed_en輸入呼吸速度調節使能信號speed[2:0]輸入呼吸速度分級&a…

我的計算機網絡(總覽篇)

總覽--網絡協議的角度 在一個龐大的網絡中&#xff0c;該從哪里去了解呢&#xff1f;我先細細的講一下我們訪問一個網站的全部流程&#xff0c;當我們的電腦連上網絡的時候&#xff0c;就會啟動DHCP協議&#xff0c;來進行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…

開源的PMPI庫實現及示例代碼

開源的PMPI庫實現及示例代碼 PMPI (Profiling MPI) 是MPI標準中定義的接口&#xff0c;允許開發者通過攔截MPI調用進行性能測量和調試。以下是幾個常用的開源PMPI庫實現&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…

Unity 基于navMesh的怪物追蹤慣性系統

今天做項目適合 策劃想要實現一個在現有的怪物追蹤系統上實現怪物擁有慣性功能 以下是解決方案分享&#xff1a; 怪物基類代碼&#xff1a; ? using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …

PyTorch進階學習筆記[長期更新]

第一章 PyTorch簡介和安裝 PyTorch是一個很強大的深度學習庫&#xff0c;在學術中使用占比很大。 我這里是Mac系統的安裝&#xff0c;相比起教程中的win/linux安裝感覺還是簡單不少&#xff08;之前就已經安好啦&#xff09;&#xff0c;有需要指導的小伙伴可以評論。 第二章…