亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

寫過C語言的同學們想必都很懷念(讀者:¿)gdb調試器,使用gdb可以隨意在程序運行過程中暫停流程、查看變量。

很多時候,我們單純分析代碼流程和日志信息無法定位的問題,都得靠調試器來幫忙;可以說有了調試器,程序員才是代碼世界完整的上帝。

Python/ target=_blank class=infotextkey>Python當然也不示弱,同樣存在這樣的巴別塔可以讓人升天

——不過阿醬必須承認的是,現代IDE集成的圖形化調試功能已經很好使了,一般情況下使用命令行工具的場景并不多。

但是也確實存在無法使用圖形化IDE的情況,因此對pdb工具略作了解還是很有必要的。畢竟誰也不知道可能被扔給一個什么樣的環境啊哈哈

pdb的使用

作為解釋型語言,Python調試工具的使用跟gdb畢竟還是有區別的。

比如Python的調試就不需要什么符號表之類的東西,說到底,最終Python虛擬機執行的邏輯也是自帶符號的。

也正是由于Python的這種特殊性,所有pdb其實有兩種不太一樣的使用方式,即侵入式和非侵入式。

其實按字面意思就很容易理解在兩種方式的使用。類比一下腦機接口,也分為侵入式和非侵入式。侵入式就表示要將電極、芯片植入大腦皮層,“侵入”人體;而非侵入式則是在頭骨外收集腦電波進行分析。

同樣地,侵入式pdb調用就是將調用pdb的代碼直接寫入Python腳本當中;而非侵入式則是從命令行調用pdb,執行相應被調試腳本。

侵入式pdb

使用方式如下代碼所示,在代碼中途插入一行調用:

import pdb; # pdb.set_trace()      a = "just"b = "do"   pdb.set_trace()   c = ['p', 'y', 't', 'h', 'o', 'n']print(a)

運行腳本,會進入這樣一個交互式界面:

D:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(21)<module>()-> c = ['p', 'y', 't', 'h', 'o', 'n'](Pdb)00-GitHubpython-examplesxuanyuanyulong020-11-04-python-pdb>python test_pdb_intrusive.py> d:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(21)<module>()-> c = ['p', 'y', 't', 'h', 'o', 'n'](Pdb)00-githubpython-examplesxuanyuanyulong020-11-04-python-pdbtest_pdb_intrusive.py(21)<module>()-> c = ['p', 'y', 't', 'h', 'o', 'n'](Pdb)

到這里已經啟動了pdb,并且打印內容中-> c = ['p', 'y', 't', 'h', 'o', 'n']行首的箭頭,表示當前程序執行流到了這一行代碼,如果繼續執行,將首先執行該行。

非侵入式pdb

非侵入式要xue微簡單一些,最大的好處是不需要改動代碼。

我們在控制臺執行以下命令:

D:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(1)<module>()-> import pdb; # pdb.set_trace()(Pdb)00-GitHubpython-examplesxuanyuanyulong020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py> d:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(1)<module>()-> import pdb; # pdb.set_trace()(Pdb)00-githubpython-examplesxuanyuanyulong020-11-04-python-pdbtest_pdb_intrusive.py(1)<module>()-> import pdb; # pdb.set_trace()(Pdb)

可以看到,通過這種方式進入調試,程序執行流停在了程序開頭。

通過分析進入調試時代碼執行流的位置,我們可以發現,實際上侵入式的插入pdb.set_trace()調用,等價于我們從命令行啟動pdb,然后在這個調用的下一行打了一個斷點,然后直接運行程序。

簡單命令

gdb中有一些常用的簡單命令,本節阿醬帶大家熟悉一下,后續會做更深入的討論。

h(elp)

在pdb界面下輸入h或help命令,即可列出pdb中支持的各種命令:

(Pdb) h   Documented commands (type help <topic>):========================================EOF    c          d        h         list      q        rv       undisplaya      cl         debug    help      ll        quit     s        untalias  clear      disable  ignore    longlist  r        source   untilargs   commands   display  interact  n         restart  step     upb      condition  down     j         next      return   tbreak   wbreak  cont       enable   jump      p         retval   u        whatisbt     continue   exit     l         pp        run      unalias  where   Miscellaneous help topics:==========================exec  pdb

在pdb后帶一個命令作為參數,還可進一步看到相應的使用說明:

(Pdb) h hh(elp)        Without argument, print the list of available commands.        With a command name as argument, print help about that command.        "help pdb" shows the full pdb documentation.        "help exec" gives help on the ! command.

相信我,help其實才是pdb里面最重要的命令。別的什么都可以記不住,但是help一定要記住。在以結果為導向的職場生活中也是一樣,遇到問題要及時求助喲~

l(ist)

打印當前文件的源代碼。不帶參數的話,默認打印當前行前后共計11行代碼。繼續執行該命令的話,則會繼續往后打印最多11行代碼,直到遇上文件結束符EOF。

用.作為參數則限定要強一點,只會打印當前行前后11行代碼。

(Pdb) l  1  -> import pdb; # pdb.set_trace()  2  3  4     def addStr(a, b):  5         return a + b  6  8         return ''.join(l)  9 10     def getSlogan(a, b, c): 11         result = addStr(a, b) + mergeChar(c)

當指定兩個參數時,則打印這個區間內的代碼:

(Pdb) l 3, 7  3  4     def addStr(a, b):  5         return a + b  6  7  -> def mergeChar(l: list):

而當第二個參數b比第一個參數a小的時候,則表示“從第a行開始,繼續往后打印b行”,也就是總共打印(1+b)行:

(Pdb) l 7, 3  7  -> def mergeChar(l: list):  8         return ''.join(l)  9 10     def getSlogan(a, b, c):

p/pp

打印某個對象的值。區別在于pp調用的是pprint函數,打印更加美觀。

(Pdb) p a'just'(Pdb) p addStr<function addStr at 0x000002087B0F9C80>

分享到:
標簽:gdb
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定