色偷偷91综合久久噜噜-色偷偷成人-色偷偷尼玛图亚洲综合-色偷偷人人澡久久天天-国内精品视频一区-国内精品视频一区二区三区

Hello! 歡迎來(lái)到小浪云!


深入了解Linux —— 調(diào)試程序


前言

然而,在編寫代碼時(shí)遇到錯(cuò)誤卻不知道錯(cuò)誤所在位置是常見的情況。在Windows下,我們可以通過(guò)調(diào)試來(lái)查找并修改代碼錯(cuò)誤的位置;但在Linux下,我們只能查看源代碼,直接查找錯(cuò)誤,這非常麻煩。

現(xiàn)在,讓我們學(xué)習(xí)如何在Linux下調(diào)試程序。

調(diào)試程序——gdb/cgdb及Debug/Release模式在學(xué)習(xí)c語(yǔ)言時(shí),我們聽說(shuō)過(guò)Debug和Release模式,只知道Debug模式是用于調(diào)試的,程序員編寫代碼的版本;而Release模式是發(fā)布版本。

現(xiàn)在讓我們看看這兩個(gè)模式的區(qū)別

首先,Debug模式會(huì)生成程序的調(diào)試信息,而Release模式不會(huì)生成這些信息。因此,Debug模式的程序比Release模式的程序文件大小要大。

我們?nèi)绾悟?yàn)證這一點(diǎn)呢?

Linux中,gcc編譯默認(rèn)生成的是Release版本。我們要生成Debug模式的程序,就需要使用-g選項(xiàng)。

假設(shè)我們有這樣一段代碼,存放在test.c文件中:

#include<stdio.h> int func(int n){     int ret = 0;     for (int i = 1; i <= n; i++) {         ret += i;     }     return ret; } int main(){     int n = 10;     int result = func(n);     printf("The sum is %dn", result);     return 0; }

在Linux下進(jìn)行編譯時(shí),可能會(huì)遇到這樣的提示,因?yàn)镃98標(biāo)準(zhǔn)不支持在for循環(huán)中定義變量,需要使用C99標(biāo)準(zhǔn):

深入了解Linux —— 調(diào)試程序

因此,我們需要這樣編譯:

gcc test.c -o test -std=c99

為了方便操作,我們可以將其寫成makefile。

這樣生成的是Release模式的程序,我們查看其文件屬性:

深入了解Linux —— 調(diào)試程序

現(xiàn)在,我們使用-g選項(xiàng)生成Debug模式的程序:

深入了解Linux —— 調(diào)試程序

可以看到,Debug模式的程序比Release模式的程序要大一些。

gdb/cgdb的使用只有Debug模式的程序才能被調(diào)試;Release模式下的程序因?yàn)槿鄙僬{(diào)試信息而無(wú)法被調(diào)試。

在使用之前,可能需要進(jìn)行安裝:

yum install -y gdb yum install -y cgdb
  1. 進(jìn)入調(diào)試:
gdb 可執(zhí)行程序

無(wú)論是gdb還是cgdb,都是對(duì)可執(zhí)行程序進(jìn)行調(diào)試。

深入了解Linux —— 調(diào)試程序

可以看到,這樣就進(jìn)入了gdb調(diào)試模式,但目前看不到我們的源代碼。

  1. 退出調(diào)試:
quit

深入了解Linux —— 調(diào)試程序

現(xiàn)在來(lái)看一下cgdb調(diào)試的界面:

cgdb test

深入了解Linux —— 調(diào)試程序

這樣的界面看起來(lái)比gdb更易用,所以我們以cgdb為例來(lái)學(xué)習(xí)調(diào)試。

退出調(diào)試仍然是quit。

  1. 查看代碼:

使用l命令查看代碼,可以不帶參數(shù),也可以帶行號(hào)或函數(shù)名。

  • l:查看源代碼,從上次位置開始,依次顯示10行代碼。
  • l 文件名:行號(hào):列出指定文件的源代碼。
  • l 函數(shù)名:列出指定函數(shù)的源代碼。

深入了解Linux —— 調(diào)試程序

深入了解Linux —— 調(diào)試程序

深入了解Linux —— 調(diào)試程序

這里列出的可能有一些差別。

  1. 運(yùn)行代碼:

我們進(jìn)入調(diào)試,但代碼并沒有運(yùn)行起來(lái)。在Windows下,我們直接按F5就可以讓代碼運(yùn)行起來(lái);而在cgdb中,使用r命令可以讓代碼運(yùn)行起來(lái)。

  • r/run,執(zhí)行代碼:

深入了解Linux —— 調(diào)試程序

逐步執(zhí)行:

  • n/next,相當(dāng)于F10,一行一行執(zhí)行代碼,在遇到函數(shù)時(shí),不進(jìn)入函數(shù)內(nèi)部;
  • s/step,相當(dāng)于F11,一行一行執(zhí)行代碼,在遇到函數(shù)時(shí),進(jìn)入函數(shù)內(nèi)部。

執(zhí)行到某處:

深入了解Linux —— 調(diào)試程序

  • r 重新執(zhí)行:

深入了解Linux —— 調(diào)試程序

  • finish:

深入了解Linux —— 調(diào)試程序

  • until 執(zhí)行到某一行:

深入了解Linux —— 調(diào)試程序

現(xiàn)在執(zhí)行until 11,讓程序執(zhí)行到第11行。

深入了解Linux —— 調(diào)試程序

  1. 斷點(diǎn)增加/刪除:

Windows下,我們通過(guò)快捷鍵F9或鼠標(biāo)點(diǎn)擊來(lái)設(shè)置和取消斷點(diǎn);在cgdb中,我們通過(guò)b/break命令來(lái)設(shè)置斷點(diǎn),通過(guò)delete/d命令來(lái)取消斷點(diǎn)。

  • b設(shè)置斷點(diǎn):
    • b 行號(hào):在指定行設(shè)置斷點(diǎn)。
    • b 函數(shù)名:在函數(shù)開頭設(shè)置斷點(diǎn)。

深入了解Linux —— 調(diào)試程序

  • info b查看所有斷點(diǎn)信息:

深入了解Linux —— 調(diào)試程序

  • d刪除斷點(diǎn):

深入了解Linux —— 調(diào)試程序

這意味著現(xiàn)在存在兩個(gè)斷點(diǎn),我們刪除了其中一個(gè),然后再次創(chuàng)建了一個(gè)斷點(diǎn),它的編號(hào)是3而不是2。

深入了解Linux —— 調(diào)試程序

深入了解Linux —— 調(diào)試程序

啟用/禁用斷點(diǎn):

你可能會(huì)問,為什么不直接刪除呢?

  • 啟用斷點(diǎn):
enable 斷點(diǎn)編號(hào)
  • 禁用斷點(diǎn):
disable 斷點(diǎn)編號(hào)

斷點(diǎn)默認(rèn)是啟用狀態(tài)的。

深入了解Linux —— 調(diào)試程序

現(xiàn)在執(zhí)行一下,看是否真的禁用了:

深入了解Linux —— 調(diào)試程序

  1. 監(jiān)視:

在Windows下,我們通過(guò)監(jiān)視窗口來(lái)查看變量的值;而在Linux的cgdb中,我們可以通過(guò)指令來(lái)查看變量的值。

  • 監(jiān)視變量p:

深入了解Linux —— 調(diào)試程序

深入了解Linux —— 調(diào)試程序

如上圖所示,每次執(zhí)行代碼時(shí),變量的值都會(huì)顯示出來(lái)。

  • 監(jiān)視函數(shù)幀內(nèi)局部變量,我們使用info/i locals:

深入了解Linux —— 調(diào)試程序

可以看到func中所有的局部變量都顯示出來(lái)了。

  • 查看當(dāng)前函數(shù)調(diào)用幀:

深入了解Linux —— 調(diào)試程序

cgdb常用小技巧:

  1. watch:

深入了解Linux —— 調(diào)試程序

我們使用info b查看斷點(diǎn)時(shí)也可以看到watch監(jiān)視的變量。

  1. set var

深入了解Linux —— 調(diào)試程序

在調(diào)試過(guò)程中,使用set var可以修改變量的值。

  1. 條件斷點(diǎn):

添加條件斷點(diǎn):

b 行號(hào) if 條件

深入了解Linux —— 調(diào)試程序

如上圖所示,新添加的條件斷點(diǎn)(當(dāng)i==10時(shí)觸發(fā))。

深入了解Linux —— 調(diào)試程序

可以看到程序在i==0時(shí),斷點(diǎn)觸發(fā),停止在第九行。

給已存在斷點(diǎn)增加條件:

當(dāng)我們需要給已經(jīng)存在的斷點(diǎn)增加條件時(shí),我們使用指令:

condition 斷點(diǎn)編號(hào) 條件

深入了解Linux —— 調(diào)試程序

到這里,本篇內(nèi)容就結(jié)束了,希望對(duì)你有所幫助。

制作不易,感謝大佬的支持。

相關(guān)閱讀

主站蜘蛛池模板: 我想看一级毛片免费的 | 中文字幕一区久久久久 | 99热这里只有精品久久免费 | 水中色av综合 | 久久综合九色综合狠狠97 | jizzjizz国产精品 | 精品视频一区二区三区免费 | 久久99国产综合精品 | 91精品久久久久 | 精品福利一区二区在线观看 | 国产一区精品 | 亚洲综合久久综合激情久久 | 99久久精品国产高清一区二区 | 日韩美女福利视频 | 日韩色网站 | 鲁一鲁综合 | 国产自产在线视频一区 | 91区国产福利在线观看午夜 | 欧美亚洲视频一区 | 黄色成视频在线播放 | 精品欧美一区二区精品久久 | 日本一道免费一区二区三区 | 亚洲国产成人精品女人久久久 | 伊久久| 日产亚洲一区二区三区 | 久久www免费人成精品香蕉 | 成人三级视频 | 天天摸天天碰成人免费视频 | 欧美大成色www永久网站婷 | 黄色片毛片 | 国产精品久久久久一区二区 | 九色亚洲 | 久久婷婷激情综合中文字幕 | 99久久精品国产一区二区成人 | 99re在线观看 | 香蕉69精品视频在线观看 | 黄色小说软件 | 久久最新免费视频 | 国产免费一区二区在线看 | 中日黄色片 | 天天天天添天天拍天天谢 |