命令行下 pdb 调试 Python 程序
官方參考網站 The Python Debugger :?https://docs.python.org/3/library/pdb.html
gdb 調試命令的使用及總結:https://blog.csdn.net/freeking101/article/details/54406982
使用 Pdb 調試 Python:https://segmentfault.com/a/1190000006628456
增強的調試器,比如 IPython 的 ipdb 和 pdb++
命令行下 pdb 調試 Python 程序
Python 提供類似于 C++ gdb 的調試工具 pdb,可以使用 pdb 在命令行下進行 Python 程序的調試。?
使用 Pdb 調試 Python 的程序的方式主要是下面的三種
- 1. 命令行加 -m 參數:python -m pdb testPdb.py
- 2. 代碼中插入一段程序(?比較常用?)。 if __name__ == "__main__":a = 1import pdbpdb.set_trace()b = 2c = a + bprint(c)
然后正常運行腳本: python testPdb.py ,程序運行到?pdb.set_trace() 就會暫停下來,然后就可以看到調試的提示符 (Pdb)了
- 3. 在 python 交互環境調試。
????????>>> import pdb
????????>>> import testPdb
????????>>> pdb.run('testPdb.test()')
下面介紹這三種方法:
python -m pdb xxx.py 或者?python -m ipdb xxx.py
1. 單步執行代碼,通過命令 python -m pdb xxx.py 啟動腳本,進入單步執行模式。即命令行啟動目標程序時加上 -m 參數。
這樣程序會自動停在第一行,等待你進行調試。
我們可以使用調試命令進行調試,和使用IED調試類似。?
?pdb命令行:
? ? 1)進入命令行Debug模式,python -m pdb xxx.py2)h:(help)幫助3)w:(where)打印當前執行堆棧4)d:(down)執行跳轉到在當前堆棧的深一層(個人沒覺得有什么用處)5)u:(up)執行跳轉到當前堆棧的上一層6)b:(break)添加斷點b 列出當前所有斷點,和斷點執行到統計次數b line_no:當前腳本的line_no行添加斷點b filename:line_no:腳本filename的line_no行添加斷點b function:在函數function的第一條可執行語句處添加斷點7)tbreak:(temporary break)臨時斷點在第一次執行到這個斷點之后,就自動刪除這個斷點,用法和b一樣8)cl:(clear)清除斷點cl 清除所有斷點cl bpnumber1 bpnumber2... 清除斷點號為bpnumber1,bpnumber2...的斷點cl lineno 清除當前腳本lineno行的斷點cl filename:line_no 清除腳本filename的line_no行的斷點9)disable:停用斷點,參數為bpnumber,和cl的區別是,斷點依然存在,只是不啟用10)enable:激活斷點,參數為bpnumber11)s:(step)執行下一條命令如果本句是函數調用,則s會執行到函數的第一句12)n:(next)執行下一條語句如果本句是函數調用,則執行函數,接著執行當前執行語句的下一條。13)r:(return)執行當前運行的函數直到結束。即執行到函數返回14)c:(continue)繼續執行,直到遇到下一條斷點15)l:(list)列出源碼l 列出當前執行語句周圍11條代碼l first 列出first行周圍11條代碼l first second 列出first--second范圍的代碼,如果second<first,second將被解析為行數16)a:(args)列出當前執行函數的函數17)p expression:(print)輸出expression的值18)pp expression:好看一點的p expression19)run:重新啟動debug,相當于restart20)q:(quit)退出debug21)j lineno:(jump)設置下條執行的語句函數只能在堆棧的最底層跳轉,向后重新執行,向前可直接執行到行號22)unt:(until)執行到下一行(跳出循環),或者當前堆棧結束23)condition bpnumber conditon,給斷點設置條件,當參數condition返回True的時候bpnumber斷點有效,否則bpnumber斷點無效24)bt : 查看調用堆棧信息注意:
? ? 1:直接輸入Enter,會執行上一條命令;
? ? 2:輸入PDB 不認識的命令,PDB 會把他當做 Python語句 在當前環境下執行;
在程序中設置 pdb 調試
方法2:在程序中設置 pdb 調試:
示例代碼(這里使用 selenium 驅動瀏覽器,然后得到 cookies ):
python selenium 用法 和 Chrome headless:https://blog.csdn.net/freeking101/article/details/70056173
注意:需要導入 pdb 包
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Author : # @File : mao_yan_cookies.py # @Software : PyCharm # @description : XXXimport pdb from selenium import webdriver from selenium.common.exceptions import NoSuchElementException import selenium.webdriver.support.ui as ui# from selenium.webdriver.common.action_chains import ActionChains# chrome_options = webdriver.ChromeOptions() # # chrome_options.add_argument('--headless') # browser = webdriver.Chrome(chrome_options=chrome_options) # # 打開瀏覽器 設定等待加載時間 訪問URL # wait = ui.WebDriverWait(browser, 10)# def test_1(): # browser.get('https://www.baidu.com/') # print('打開瀏覽器') # print(browser.title) # browser.find_element_by_id('kw').send_keys('測試') # print('關閉') # browser.quit() # print('測試完成') # # # def test_2(): # url = "https://www.newrank.cn/public/info/list.html?period=pgcweek&type=data" # browser.get(url) # print(browser.page_source) # 打印渲染后的頁面代碼 # # # def test_3(): # url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' # browser.get(url) # browser.switch_to.frame('iframeResult') # 切換到 嵌套的 html 頁面 # source = browser.find_element_by_css_selector('#draggable') # print(source) # try: # logo = browser.find_element_by_class_name('logo') # except NoSuchElementException: # print('NO LOGO') # browser.switch_to.parent_frame() # 返回到父 html 頁面 # logo = browser.find_element_by_class_name('logo') # print(logo) # print(logo.text)class MaoYanCookies(object):def __init__(self):super(MaoYanCookies, self).__init__()chrome_options = webdriver.ChromeOptions()# chrome_options.add_argument('--headless')self.browser = webdriver.Chrome(chrome_options=chrome_options)# 打開瀏覽器 設定等待加載時間 訪問URLself.wait = ui.WebDriverWait(self.browser, 10)passdef get_cookies(self):cinema_url = 'http://maoyan.com/cinema/15280'self.browser.get(cinema_url)base_time_element = self.browser.find_element_by_xpath('//table[@class="plist"]//tbody//td//a')base_time_url = base_time_element.get_attribute('href')print(base_time_url)self.browser.get(base_time_url)cookies = self.browser.get_cookies()print(cookies)passdef __del__(self):self.browser.close()if __name__ == "__main__":# test_1()# test_2()# test_3()pdb.set_trace() # <-- Break point added here,設置的斷點myc = MaoYanCookies()myc.get_cookies()pass在程序中需要打斷點處添加?pdb.set_trace()? ,這樣程序會在 pdb.set_trace() 暫停并進入 pdb 調試環境,可以用 “p 變量名” 查看變量,或者 c 繼續運行
命令行直接輸入命令:python?mao_yan_cookies.py,然后 回車
Python --- pdb 調試工具
From:http://www.bubuko.com/infodetail-1860030.html
學 C++ 時,老師教我們有 gdb 調試工具,在工作中會經常用到;
學 shell 時,經理讓我見到了 "-x" 跟蹤調試參數,我每天都會用到;
學 Python 后,我就在尋找類似的參數和工具,谷歌給了我 pdb 工具;
增強的調試器,比如 IPython 的 ipdb 和 pdb++,它們一般都提供了更好的用戶體驗,添加了有用的額外功能,例如語法突出高亮、更好的回溯和自省。
pdb++
pdb
import pdb ? ? pdb.set_trace() ?#設置斷點的地方,放置于程序中ipdb (?python -m ipdb xxx.py )
相對于?python ,ipython 有漂亮的顏色,和<tab>補全提示,以及 bash 混用;
相對于 python 內置的 pdb,ipdb 的優勢也正在于此,其實就是對 ipython 的調用:
使用時需要先安裝 ipdb 包:pip install ipdb
import ipdb ipdb.set_trace()或者:python -m ipdb xxx.py #單步調試
ipdb 用法和 pdb 類似,只是更友好,更直觀,如下:??
常用命令
- ENTER(重復上次命令)
- c(繼續)
- l(查找當前位于哪里)
- s(進入子程序)
- r(運行直到子程序結束)
- !<python 命令>
- h(幫助)
- a(rgs) 打印當前函數的參數
- j(ump) 讓程序跳轉到指定的行數
- l(ist) 可以列出當前將要運行的代碼塊
- n(ext) 讓程序運行下一行,如果當前語句有一個函數調用,用 n 是不會進入被調用的函數體中的
- p(rint) 最有用的命令之一,打印某個變量
- q(uit) 退出調試
- r(eturn) 繼續執行,直到函數體返回
- s(tep) 跟 n 相似,但是如果當前有一個函數調用,那么 s 會進入被調用的函數體中
pudb
是全屏的基于控制臺的可視化調試器,有點像 c 語言中的 Turbo C 樣式
為了支持 pudb,需要在代碼中插入:from pudb import set_trace; set_trace() ?or ?import pudb
rpdb
上面的兩種方案要求有終端輸出的情況下可行,有時候我們需要以后臺形式執行 python,此時是沒有輸出交互的,比如 django 開發,程序由 uwsgi 管理執行,標準輸出已重定向,通常只能通過日志輸出信息。這個時候我們就需要一個遠程調試工具。
rpdb 會開啟一個 socket 連接,用于遠程調試,默認端口是 4444:
這樣當程序被 hang 住之后,會監聽該端口,可遠程連接進行調試:
nc 127.0.0.1 12345
ripdb
rpdb只是 pdb 的遠程版本,而 ripdb 就是將 rpdb 和 ipdb 的功能進行了整合,既有遠程調試功能,又有漂亮的代碼顏色:
import ripdb ripdb.set_trace(port=12345)如果還需要<Tab>自動補全功能,還需要對終端進行一下設置:
SAVED_STTY=`stty -g`; stty -icanon -opost -echo -echoe -echok -echoctl -echoke; nc 127.0.0.1 12345; stty $SAVED_STTY
總結
以上是生活随笔為你收集整理的命令行下 pdb 调试 Python 程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王爽 汇编语言第三版 第9章 转移指令的
- 下一篇: 菜鸟教程 之 JavaScript 函数