精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Python調試過程中設置不中斷的斷點

開發(fā) 后端
你對如何讓調試器變得更快產(chǎn)生過興趣嗎?本文將分享我們在為 Python 構建調試器時得到的一些經(jīng)驗。

[[318424]]

你對如何讓調試器變得更快產(chǎn)生過興趣嗎?本文將分享我們在為 Python 構建調試器時得到的一些經(jīng)驗。

整段故事講的是我們在 Rookout 公司的團隊為 Python 調試器開發(fā)不中斷斷點的經(jīng)歷,以及開發(fā)過程中得到的經(jīng)驗。我將在本月于舊金山舉辦的 PyBay 2019 上介紹有關 Python 調試過程的更多細節(jié),但現(xiàn)在就讓我們立刻開始這段故事。

Python 調試器的心臟:sys.set_trace

在諸多可選的 Python 調試器中,使用最廣泛的三個是:

  • pdb,它是 Python 標準庫的一部分
  • PyDev,它是內嵌在 Eclipse 和 Pycharm 等 IDE 中的調試器
  • ipdb,它是 IPython 的調試器

Python 調試器的選擇雖多,但它們幾乎都基于同一個函數(shù):sys.settrace。 值得一提的是, sys.settrace 可能也是 Python 標準庫中最復雜的函數(shù)。

 

set_trace Python 2 docs page

簡單來講,settrace 的作用是為解釋器注冊一個跟蹤函數(shù),它在下列四種情形發(fā)生時被調用:

  • 函數(shù)調用
  • 語句執(zhí)行
  • 函數(shù)返回
  • 異常拋出

一個簡單的跟蹤函數(shù)看上去大概是這樣:

  1. def simple_tracer(frame, event, arg):
  2.   co = frame.f_code
  3.   func_name = co.co_name
  4.   line_no = frame.f_lineno
  5.   print("{e} {f} {l}".format(
  6. e=event, f=func_name, l=line_no))
  7.   return simple_tracer

在分析函數(shù)時我們首先關注的是參數(shù)和返回值,該跟蹤函數(shù)的參數(shù)分別是:

  • frame,當前堆棧幀,它是包含當前函數(shù)執(zhí)行時解釋器里完整狀態(tài)的對象
  • event,事件,它是一個值可能為 calllinereturn 或 exception 的字符串
  • arg,參數(shù),它的取值基于 event 的類型,是一個可選項

該跟蹤函數(shù)的返回值是它自身,這是由于解釋器需要持續(xù)跟蹤兩類跟蹤函數(shù):

  • 全局跟蹤函數(shù)(每線程):該跟蹤函數(shù)由當前線程調用 sys.settrace 來設置,并在解釋器創(chuàng)建一個新的堆棧幀時被調用(即代碼中發(fā)生函數(shù)調用時)。雖然沒有現(xiàn)成的方式來為不同的線程設置跟蹤函數(shù),但你可以調用 threading.settrace 來為所有新創(chuàng)建的 threading 模塊線程設置跟蹤函數(shù)。
  • 局部跟蹤函數(shù)(每一幀):解釋器將該跟蹤函數(shù)的值設置為全局跟蹤函數(shù)創(chuàng)建幀時的返回值。同樣也沒有現(xiàn)成的方法能夠在幀被創(chuàng)建時自動設置局部跟蹤函數(shù)。

該機制的目的是讓調試器對被跟蹤的幀有更精確的把握,以減少對性能的影響。

簡單三步構建調試器 (我們最初的設想)

僅僅依靠上文提到的內容,用自制的跟蹤函數(shù)來構建一個真正的調試器似乎有些不切實際。幸運的是,Python 的標準調試器 pdb 是基于 Bdb 構建的,后者是 Python 標準庫中專門用于構建調試器的基類。

基于 Bdb 的簡易斷點調試器看上去是這樣的:

  1. import bdb
  2. import inspect
  3.  
  4. class Debugger(bdb.Bdb):
  5.   def __init__(self):
  6.       Bdb.__init__(self)
  7.       self.breakpoints = dict()
  8.       self.set_trace()
  9.  
  10. def set_breakpoint(self, filename, lineno, method):
  11.   self.set_break(filename, lineno)
  12.   try :
  13.       self.breakpoints[(filename, lineno)].add(method)
  14.   except KeyError:
  15.       self.breakpoints[(filename, lineno)] = [method]
  16.  
  17. def user_line(self, frame):
  18.   if not self.break_here(frame):
  19.       return
  20.  
  21.   # Get filename and lineno from frame
  22.   (filename, lineno, _, _, _) = inspect.getframeinfo(frame)
  23.  
  24.   methods = self.breakpoints[(filename, lineno)]
  25.   for method in methods:
  26.       method(frame)

這個調試器類的全部構成是:

  1. 繼承 Bdb,定義一個簡單的構造函數(shù)來初始化基類,并開始跟蹤。
  2. 添加 set_breakpoint 方法,它使用 Bdb 來設置斷點,并跟蹤這些斷點。
  3. 重載 Bdb 在當前用戶行調用的 user_line 方法,該方法一定被一個斷點調用,之后獲取該斷點的源位置,并調用已注冊的斷點。

這個簡易的 Bdb 調試器效率如何呢?

Rookout 的目標是在生產(chǎn)級性能的使用場景下提供接近普通調試器的使用體驗。那么,讓我們來看看先前構建出來的簡易調試器表現(xiàn)的如何。

為了衡量調試器的整體性能開銷,我們使用如下兩個簡單的函數(shù)來進行測試,它們分別在不同的情景下執(zhí)行了 1600 萬次。請注意,在所有情景下斷點都不會被執(zhí)行。

  1. def empty_method():
  2.    pass
  3.  
  4. def simple_method():
  5.    a = 1
  6.    b = 2
  7.    c = 3
  8.    d = 4
  9.    e = 5
  10.    f = 6
  11.    g = 7
  12.    h = 8
  13.    i = 9
  14.    j = 10

在使用調試器的情況下需要大量的時間才能完成測試。糟糕的結果指明了,這個簡陋 Bdb 調試器的性能還遠不足以在生產(chǎn)環(huán)境中使用。

 

First Bdb debugger results

對調試器進行優(yōu)化

降低調試器的額外開銷主要有三種方法:

  1. 盡可能的限制局部跟蹤:由于每一行代碼都可能包含大量事件,局部跟蹤比全局跟蹤的開銷要大得多。
  2. 優(yōu)化 call 事件并盡快將控制權還給解釋器:在 call 事件發(fā)生時調試器的主要工作是判斷是否需要對該事件進行跟蹤。
  3. 優(yōu)化 line 事件并盡快將控制權還給解釋器:在 line 事件發(fā)生時調試器的主要工作是判斷我們在此處是否需要設置一個斷點。

于是我們復刻了 Bdb 項目,精簡特征、簡化代碼,針對使用場景進行優(yōu)化。這些工作雖然得到了一些效果,但仍無法滿足我們的需求。因此我們又繼續(xù)進行了其它的嘗試,將代碼優(yōu)化并遷移至 .pyx 使用 Cython 進行編譯,可惜結果(如下圖所示)依舊不夠理想。最終,我們在深入了解 CPython 源碼之后意識到,讓跟蹤過程快到滿足生產(chǎn)需求是不可能的。

 

Second Bdb debugger results

放棄 Bdb 轉而嘗試字節(jié)碼操作

熬過先前對標準調試方法進行的試驗-失敗-再試驗循環(huán)所帶來的失望,我們將目光轉向另一種選擇:字節(jié)碼操作。

Python 解釋器的工作主要分為兩個階段:

  1. 將 Python 源碼編譯成 Python 字節(jié)碼:這種(對人類而言)不可讀的格式專為執(zhí)行的效率而優(yōu)化,它們通常緩存在我們熟知的 .pyc 文件當中。
  2. 遍歷 解釋器循環(huán)中的字節(jié)碼: 在這一步中解釋器會逐條的執(zhí)行指令。

我們選擇的模式是:使用字節(jié)碼操作來設置沒有全局額外開銷的不中斷斷點。這種方式的實現(xiàn)首先需要在內存中的字節(jié)碼里找到我們感興趣的部分,然后在該部分的相關機器指令前插入一個函數(shù)調用。如此一來,解釋器無需任何額外的工作即可實現(xiàn)我們的不中斷斷點。

這種方法并不依靠魔法來實現(xiàn),讓我們簡要地舉個例子。

首先定義一個簡單的函數(shù):

  1. def multiply(a, b):
  2.    result = a * b
  3.    return result

inspect 模塊(其包含了許多實用的單元)的文檔里,我們得知可以通過訪問 multiply.func_code.co_code 來獲取函數(shù)的字節(jié)碼:

  1. '|\x00\x00|\x01\x00\x14}\x02\x00|\x02\x00S'

使用 Python 標準庫中的 dis 模塊可以翻譯這些不可讀的字符串。調用 dis.dis(multiply.func_code.co_code) 之后,我們就可以得到:

  1.   4          0 LOAD_FAST               0 (a)
  2.              3 LOAD_FAST               1 (b)
  3.              6 BINARY_MULTIPLY    
  4.              7 STORE_FAST              2 (result)
  5.  
  6.   5         10 LOAD_FAST               2 (result)
  7.             13 RETURN_VALUE      

與直截了當?shù)慕鉀Q方案相比,這種方法讓我們更靠近發(fā)生在調試器背后的事情。可惜 Python 并沒有提供在解釋器中修改函數(shù)字節(jié)碼的方法。我們可以對函數(shù)對象進行重寫,不過那樣做的效率滿足不了大多數(shù)實際的調試場景。最后我們不得不采用一種迂回的方式來使用原生拓展才能完成這一任務。

總結

在構建一個新工具時,總會學到許多事情的工作原理。這種刨根問底的過程能夠使你的思路跳出桎梏,從而得到意料之外的解決方案。

在 Rookout 團隊中構建不中斷斷點的這段時間里,我學到了許多有關編譯器、調試器、服務器框架、并發(fā)模型等等領域的知識。如果你希望更深入的了解字節(jié)碼操作,谷歌的開源項目 cloud-debug-python 為編輯字節(jié)碼提供了一些工具。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2010-11-11 09:40:34

BUG

2009-09-27 08:57:29

Visual Stud

2019-06-04 06:02:25

滲透測試漏洞腳本

2009-11-25 10:23:57

VS2003環(huán)境

2015-11-26 13:11:24

javascript原型鏈作用域

2009-02-27 11:36:25

面試成績

2010-07-01 14:05:43

SNMPMIB

2010-03-15 09:11:25

Python編程版面

2023-09-11 17:39:35

SSH服務TCP

2015-08-05 15:42:10

程序員面試問題

2009-10-09 10:21:31

Visual Stud

2024-01-03 16:28:46

WinDbg命令調試

2019-08-05 09:15:39

Java程序員設計

2013-10-18 09:30:04

OSPF協(xié)議OSPF

2010-03-17 09:11:01

Python安裝 配置

2017-05-08 16:30:51

公共云宕機云計算

2013-04-03 10:42:46

iOS開發(fā)調試運行代碼

2010-06-04 17:03:17

實現(xiàn)Hadoop

2017-12-18 16:50:26

Gobug編譯

2010-08-25 21:08:51

DHCP服務器
點贊
收藏

51CTO技術棧公眾號

精品日韩在线| 自由日本语热亚洲人| 国产精品主播直播| 欧美精品videosex性欧美| 欧美激情 亚洲| 亚洲性受xxx喷奶水| 中文字幕一区二区三区视频| 国产91精品入口17c| 欧美性猛交bbbbb精品| 欧美电影一二区| 精品国产乱码久久久久久久久| 国产视频一视频二| 激情在线小视频| 99久久精品免费看| 成人精品一区二区三区| 免费看日韩毛片| 久久视频在线| 亚洲精品国产福利| 亚洲在线观看网站| 大胆人体一区| 亚洲午夜成aⅴ人片| 亚洲韩国在线| 神马电影在线观看| 国产精品一区免费视频| 国产99在线|中文| 精品无码一区二区三区电影桃花 | 一区二区三区视频在线观看视频| 丁香婷婷综合五月| 91久久久久久久久久久| 国产又黄又猛又粗又爽| 国产精品多人| 精品国偷自产在线视频| 精品少妇人妻一区二区黑料社区| 欧洲一区在线| 欧美日韩高清一区二区三区| 欧美日韩激情视频在线观看| 91亚洲天堂| 国产精品美女久久久久高潮| 美脚丝袜一区二区三区在线观看| 精品乱子伦一区二区| 看电视剧不卡顿的网站| 国产成人精品优优av| 久久黄色精品视频| 亚洲午夜极品| 欧美成人亚洲成人| 国产精品嫩草影院俄罗斯| 国产videos久久| 日韩精品亚洲精品| 亚洲中文字幕无码av| 97精品久久| 精品国产伦一区二区三区观看体验| 视频在线观看免费高清| 99久久久国产精品免费调教网站| 色综合久久久久久久| 色欲av无码一区二区人妻| 色网在线免费观看| 黑人精品xxx一区| 国产精品免费入口| 日本三级一区| 欧美性感美女h网站在线观看免费| 日韩a∨精品日韩在线观看| 18video性欧美19sex高清| 亚洲va国产天堂va久久en| 国产精品国三级国产av| 性直播体位视频在线观看| 亚洲另类在线一区| 国产专区在线视频| 波多野结衣久久| 偷窥少妇高潮呻吟av久久免费| 人妻激情另类乱人伦人妻| 丝袜在线观看| 午夜精品久久久久久久| 99蜜桃臀久久久欧美精品网站| 深夜成人在线| 欧美一a一片一级一片| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 国产精品极品美女在线观看| 欧美亚一区二区| 亚洲黄色av片| 97久久综合区小说区图片区| 日韩av在线免费观看一区| 国产呦小j女精品视频| 精品久久国产| 另类天堂视频在线观看| 免费一级黄色大片| 国产亚洲毛片| 国产精品视频在线观看| 国产又粗又黄又爽的视频| 国产传媒久久文化传媒| 国产区二精品视| 第一福利在线| 一区二区三区欧美| 欧美成人免费高清视频| 亚洲精品66| 亚洲第一国产精品| 国产又粗又猛又爽又黄的视频四季 | 日韩 欧美 精品| 在线亚洲观看| 成人欧美一区二区三区黑人孕妇| 国产又粗又大又爽视频| 99精品一区二区| 亚洲国产精品123| 欧美xxxx做受欧美88bbw| 一本色道a无线码一区v| 久久6免费视频| 一道在线中文一区二区三区| 久久精品国产清自在天天线 | 激情久久久久| 国产成人一区二| www.天堂在线| 国产欧美日韩不卡| www.av毛片| 色8久久久久| 日韩精品中文字| 天天看片中文字幕| 视频一区二区三区入口| 国产91社区| 黄色免费网站在线| 日本国产一区二区| 久久久久9999| 欧美三级网页| 国产欧美日韩精品丝袜高跟鞋| 人妻视频一区二区三区| 自拍偷拍亚洲欧美日韩| 欧美一级黄色影院| 久久九九热re6这里有精品 | 欧美日产一区二区三区在线观看| 在线中文字幕-区二区三区四区| 色久优优欧美色久优优| 国产一线在线观看| 欧美黄在线观看| 国产精品在线看| 国产最新视频在线| 日韩欧美在线视频日韩欧美在线视频| xxxx视频在线观看| 91精品福利| 国产日韩在线看片| 91在线网址| 欧美专区在线观看一区| 国产在线观看无码免费视频| 亚洲韩日在线| 成人免费视频观看视频| 欧美日韩经典丝袜| 日韩免费在线观看| 久久99久久久| 国产suv一区二区三区88区| 国产在线无码精品| 国产亚洲高清一区| 久久久精品2019中文字幕神马| 中文永久免费观看| 亚洲国产精品成人综合| 中文久久久久久| 欧洲三级视频| 国产精品女主播| aaa在线免费观看| 欧美性猛片xxxx免费看久爱| 亚洲精品午夜视频| 日本不卡一区二区| 亚洲免费久久| 亚洲成人高清| 久久99久久99精品中文字幕| www.av在线.com| 亚洲国产精品久久人人爱| 亚洲少妇中文字幕| 国产日韩一区二区三区在线| 久久久一本精品99久久精品66| 中文字幕乱码中文乱码51精品| 日韩大片在线观看视频| 人人爽人人爽人人片av| 亚洲国产经典视频| 亚洲精品mv在线观看| 女人天堂亚洲aⅴ在线观看| wwwxx欧美| 蜜桃视频www网站在线观看| 亚洲欧美日韩中文在线制服| www.久久网| 亚洲欧洲韩国日本视频| 岛国大片在线免费观看| 日韩亚洲国产精品| 日韩欧美视频一区二区| 亚洲伊人精品酒店| 久久久久久久激情视频| 精品999视频| 欧美久久久影院| 久久一区二区三| 久久免费国产精品| 亚洲精品在线视频播放| 99av国产精品欲麻豆| 色播五月综合| 深夜福利一区| 欧美专区日韩视频| 久久77777| 亚洲国产欧美日韩精品| 中文在线观看免费高清| 一区二区三区在线观看国产| 人妻无码一区二区三区| 国产资源精品在线观看| 日日碰狠狠添天天爽超碰97| 欧美电影一区| 蜜桃av色综合| 亚洲不卡视频| 国产精品精品久久久久久| 新版中文在线官网| 亚洲香蕉成人av网站在线观看 | 亚洲精品电影网站| 亚洲自拍第二页| 婷婷激情综合网| 欧美一级片在线视频| 91视频国产观看| 亚洲欧美一区二区三区不卡| 久久国产福利| 欧美又粗又长又爽做受| 日韩欧美电影| 麻豆视频成人| 凹凸成人在线| 亚洲一区二区久久久久久久| 日本韩国欧美| 亚州精品天堂中文字幕| 成人在线直播| 丝袜一区二区三区| 九九九伊在人线综合| 欧美成人video| 亚洲一区在线观| 色94色欧美sute亚洲线路二 | 午夜在线播放| 亚洲人av在线影院| 亚州视频一区二区三区| 欧美成人免费网站| 国产精品九九九九| 欧美色视频在线| 久久影视中文字幕| 黑丝美女久久久| 日本少妇bbwbbw精品| 一区二区三区在线影院| 久久久99999| 中文字幕+乱码+中文字幕一区| 法国伦理少妇愉情| 99久久精品国产毛片| 亚洲一级Av无码毛片久久精品| 国产主播一区二区| 欧美特黄aaa| 久久99最新地址| 在线观看国产一级片| 日本欧美一区二区在线观看| 久久婷婷国产精品| 久久精品观看| 免费男同深夜夜行网站| 久久亚洲二区| 国产免费视频传媒| 热久久久久久久| 丁香婷婷激情网| 日韩激情在线观看| 天天视频天天爽| 另类小说欧美激情| 色天使在线观看| 国产在线播放一区二区三区| 国产精品探花在线播放| 国产精品综合在线视频| 一起草最新网址| 成人激情文学综合网| japanese在线观看| 久久综合一区二区| 亚欧精品视频一区二区三区| 国产精品欧美经典| www.av成人| 亚洲国产日韩精品| 无码一区二区三区在线观看| 欧美视频在线一区二区三区 | 亚洲淫成人影院| 国产成人高潮免费观看精品| 国产一区二区精品调教| 国产精品自产拍高潮在线观看| 91精品福利观看| 99中文视频在线| 日韩大尺度在线观看| 日产中文字幕在线精品一区| 久久美女精品| 男人添女人下部视频免费| 在线成人黄色| 成人三级视频在线播放| 另类小说欧美激情| 亚洲一区二区三区黄色| 久久精品人人做人人爽人人| 三级黄色录像视频| 亚洲午夜免费电影| 欧美超碰在线观看| 日韩小视频在线观看专区| 人成网站在线观看| 日韩在线视频观看| hd国产人妖ts另类视频| 日本中文字幕成人| 成人自拍视频| 久久亚裔精品欧美| 五月婷婷六月综合| 日韩精品视频一区二区在线观看| 日本成人在线视频网站| 极品白嫩少妇无套内谢| 久久精品一区二区三区不卡 | 福利视频在线看| 欧美高清在线视频观看不卡| 超碰aⅴ人人做人人爽欧美| 91免费视频网站| 一区三区在线欧| 成人污网站在线观看| 日韩国产精品久久久久久亚洲| 中文字幕乱妇无码av在线| 国产亚洲人成网站| 黄色小视频在线免费看| 欧美日韩国产精选| 偷拍自拍在线| 欧美精品在线播放| 免费在线观看一区| 国产欧美一区二区三区另类精品| 久久精品久久久| 日韩有码免费视频| 成人动漫在线一区| 亚洲二区在线播放| 在线观看一区日韩| 天堂网www中文在线| 欧美高清自拍一区| 国产精品色婷婷在线观看| 欧美日韩亚洲免费| 日韩视频一区| 中文字幕第九页| 亚洲精品国产品国语在线app| 国产三级理论片| 精品无人国产偷自产在线| 黄页网站在线| 51国偷自产一区二区三区| 三级电影一区| 久久婷婷国产91天堂综合精品| 99久久精品国产导航| 强乱中文字幕av一区乱码| 欧美军同video69gay| 在线观看h片| 日本一区二区在线播放| 欧美三级午夜理伦三级在线观看 | 色网在线观看| 亚洲一区亚洲二区| 这里只有精品在线| 亚洲免费成人在线视频| 国产精品久久久久久久久快鸭| 日本免费精品视频| 亚洲欧美日韩国产中文专区| 热三久草你在线| 久久国产欧美精品| 亚洲欧美日韩视频二区| aaaaa级少妇高潮大片免费看| 懂色av一区二区三区| 丝袜+亚洲+另类+欧美+变态| 538国产精品一区二区在线| 亚洲精品3区| 日av中文字幕| 国产日韩成人精品| 中文无码av一区二区三区| 中文字幕日韩视频| 97色婷婷成人综合在线观看| 久久久国产精华液999999| 国产精品一区二区在线观看网站| 国产精品三区在线观看| 欧美一区二区观看视频| 欧美aaaaaaa| 精品综合久久| 日日夜夜精品视频天天综合网| 人人爽人人爽人人片| 欧美日韩激情一区二区| 最近中文字幕免费mv2018在线| 成人激情直播| 宅男噜噜噜66一区二区| 免费看黄色的视频| 欧美美女网站色| 手机在线免费看av| 久久99精品久久久久久水蜜桃| 日日摸夜夜添夜夜添精品视频| 国精产品一区一区| 日韩一级大片在线观看| 国产精品一二三产区| 欧美少妇一区| 国产在线播放一区三区四| 国产乱码久久久久久| 亚洲欧美中文日韩在线v日本| 国产精品天堂蜜av在线播放| 日本a级片在线观看| 久久午夜国产精品| 亚洲资源在线播放| 国模叶桐国产精品一区| 欧美亚洲激情| 潘金莲一级淫片aaaaa| 欧美性20hd另类| 日本中文字幕视频在线| 激情伦成人综合小说| 捆绑调教美女网站视频一区| 国产精品二区一区二区aⅴ| 国产亚洲精品久久久久久牛牛| 精品精品视频| 男人舔女人下面高潮视频| 亚洲女爱视频在线| 免费看男男www网站入口在线 | 色综合久久久久久中文网| 日韩成人动漫在线观看|