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

JavaScript Debugger 原理揭秘

開發 前端
代碼寫完會運行一下看下效果,開發的時候我們更多都是通過 dubugger 來單步或斷點運行。我們整天在用 debugger,可是你有想過它的實現原理么。

[[399391]]

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光zxg。轉載本文請聯系神光的編程秘籍公眾號。

代碼寫完會運行一下看下效果,開發的時候我們更多都是通過 dubugger 來單步或斷點運行。我們整天在用 debugger,可是你有想過它的實現原理么。

本文會解答以下問題:

  • 代碼運行的底層原理是什么
  • 為什么需要 debugger
  • debugger 實現原理是什么
  • 如何實現 debugger 客戶端

代碼運行的原理是什么

代碼的運行方式可以分為直接執行和解釋執行兩類。

不知道平時你有沒有注意,可執行文件直接 ./xxx 就可以執行,而執行 js 文件需要 node ./xxx,執行 python 文件需要 python ./xxx,這就是編譯執行(直接執行)和解釋執行的區別。

直接執行

cpu 提供了一套指令集,基于這套指令集就可以控制整個計算機的運轉,機器語言的代碼就是由這些指令和對應的操作數構成的,這些機器碼可以直接跑在計算機上,也就是可直接執行。由它們構成的文件叫做可執行文件。

不同操作系統可執行文件的格式不同,在 windows 上是 pe(Portable Executable) 格式,在 linux、unix 系統上是 elf(Executable Linkable Format) 格式,在 mac 上是 mash-o 格式。它們規定了不同的內容(.text 是代碼、.data .bass 等是數據)放在文件中的什么位置。但其中真正可執行的部分還是由 cpu 提供的機器指令構成的。

編譯型語言會經過編譯、匯編、鏈接的階段,編譯是把源代碼轉成匯編語言構成的中間代碼,匯編是把中間代碼變成目標代碼,鏈接會把目標代碼組合成可執行文件。這個可執行文件是可以在操作系統上直接執行的。就因為它是由 cpu 的機器指令構成的,可以直接控制 cpu。所以可以直接 ./xxx 就可以執行。

解釋執行

編譯型語言都是生成可執行文件直接在操作系統上來執行的,不需要安裝解釋器,而 js、python 等解釋型語言的代碼需要用解釋器來跑。

為什么有了解釋器就不需要生成機器碼了,cpu 仍然不認識這些代碼啊?

那是因為解釋器是需要編譯成機器碼的,cpu 知道怎么執行解釋器,而解釋器知道怎么執行更上層的腳本代碼,就這樣,由機器碼解釋執行解釋器,再由解釋器解釋執行上層代碼,這就是腳本語言的原理。 包括 js、python 等都是這樣。

但是解釋器畢竟多了一層,所以有的時候會把它編譯成機器碼來直接執行,這就是 JIT 編譯器。比如 js 引擎一般就是由 parser、解釋器、JIT 編譯器、GC 構成,大部分代碼是由解釋器解釋執行的,而熱點代碼會經過 JIT 編譯器編譯成由機器碼,直接在操作系統上執行以提高性能。

編譯成機器碼直接執行,或者是從源碼解釋執行,代碼就這兩種執行方式。兩者各有各的好處,編譯型速度快,解釋型跨平臺。這就是代碼運行的原理。

王垠說過,計算機的本質就是解釋器。就是說 cpu 用電路解釋機器碼,解釋器用機器碼解釋更上層的腳本代碼,所以計算機的本質是解釋器。

為什么需要 debugger

我們知道,圖靈完備的語言可以解釋任何可計算問題,所以不管是編譯型還是解釋型都能夠描述所有可計算的業務邏輯。

我們利用不同的語言描述業務邏輯,然后運行它看效果,當代碼的邏輯比較復雜的時候,難免會出錯,我們希望能夠一步步運行或是運行到某個點停下來,然后看一下當時的環境中的變量,執行某個腳本。完成這個功能的就是 debugger。

也許還有很多初級程序員只會用 console.log 打日志,但是日志不能完全展現當時的環境,最好的方式還是 debugger。

狼叔說過,是否會用 debugger 是 nodejs 水平的一個明顯的區分。

debugger 的原理

我們知道了 debugger 是調試程序必不可少的,那么它是怎么實現的呢?

可執行文件的 debugger

其實 cpu、操作系統在設計的時候就支持了 debugger 的能力(可見 debugger 的重要性),cpu 里面有 4 個寄存器可以做硬中斷,操作系統提供了系統調用來做軟中斷。這是編譯型語言的 debugger 實現的基礎。

中斷

cpu 只會不斷的執行下一條指令,但程序運行過程中難免要處理一些外部的消息,比如 io、網絡、異常等等,所以設計了中斷的機制,cpu 每執行完一條指令,就會去看下中斷標記,是否需要中斷了。就像 event loop 每次 loop 完都要檢查下是否需要渲染一樣。

INT 指令

cpu 支持 INT 指令來觸發中斷,中斷有編號,不同的編號有不同的處理程序,記錄編號和中斷處理程序的表叫做中斷向量表。其中 INT 3 (3 號中斷)可以觸發 debugger,這是一種約定。

那么可執行文件是怎么利用這個 3 號中斷來 debugger 的呢?其實就是運行時替換執行的內容,debugger 程序會在需要設置斷點的位置把指令內容換成 INT 3,也就是 0xCC,這就斷住了。就可以獲取這時候的環境數據來做調試。

通過機器碼替換成 0xcc (INT 3)是把程序斷住了,可是怎么恢復執行呢?其實也比較簡單,把當時替換的機器碼記錄下來,需要釋放斷點的時候再換回去就行了。

這就是可執行文件的 debugger 的原理了,最終還是靠 cpu 支持的中斷機制來實現的。

中斷寄存器

上面說的 debugger 實現方式是修改內存中的機器碼的方式,但有的時候修改不了代碼,比如 ROM,這種情況就要通過 cpu 提供的 4 個中斷寄存器(DR0 - DR3)來做了。這種叫做硬中斷。

總之,INT 3 的軟中斷,還有中斷寄存器的硬中斷,是可執行文件實現 debugger 的兩種方式。

解釋型語言的 debugger

編譯型語言因為直接在操作系統之上執行,所以要利用 cpu 和操作系統的中斷機制和系統調用來實現 debugger。但是解釋型語言是自己實現代碼的解釋執行的,所以不需要那一套,但是實現思路還是一樣的,就是插入一段代碼來斷住,支持環境數據的查看和代碼的執行,當釋放斷點的時候就繼續往下執行。

比如 javascript 中支持 debugger 語句,當解釋器執行到這一條語句的時候就會斷住。

解釋型語言的 debugger 相對簡單一些,不需要了解 cpu 的 INT 3 中斷。

debugger 客戶端

上面我們了解了直接執行和解釋執行的代碼的 debugger 分別是怎么實現的。我們知道了代碼是怎么斷住的,那么斷住之后呢?怎么把環境數據暴露出去,怎么執行外部代碼?

這就需要 debugger 客戶端了。

比如 v8 引擎會把設置斷點、獲取環境信息、執行腳本的能力通過 socket 暴露出去,socket 傳遞的信息格式就是 v8 debug protocol 。

比如:

設置斷點:

  1.     "seq":117, 
  2.     "type":"request"
  3.     "command":"setbreakpoint"
  4.     "arguments":{ 
  5.         "type":"function"
  6.         "target":"f" 
  7.     } 

去掉斷點:

  1.     "seq":117, 
  2.     "type":"request"
  3.     "command":"clearbreakpoint"
  4.     "arguments": { 
  5.         "type":"function"
  6.         "breakpoint":1 
  7.      } 

繼續:

  1.     "seq":117, 
  2.     "type":"request"
  3.     "command":"continue" 

執行代碼:

  1.     "seq":117, 
  2.     "type":"request"
  3.     "command":"evaluate"
  4.     "arguments":{ 
  5.         "expression":"1+2" 
  6.     } 

感興趣的同學可以去 v8 debug protocol 的文檔中去查看全部的協議。

基于這些協議就可以控制 v8 的 debugger 了,所有的能夠實現 debugger 的都是對接了這個協議,比如 chrome devtools、vscode debugger 還有其他各種 ide 的 debugger。

nodejs 代碼的調試

nodejs 可以通過添加 --inspect 的 option 來做調試(也可以是 --inspect-brk,這個會在首行就斷住)。

它會起一個 debugger 的 websocket 服務端,我們可以用 vscode 來調試 nodejs 代碼,也可以用 chrome devtools 來調試(見 nodejs debugger 文檔)。

  1. ➜ node --inspect test.js 
  2. Debugger listening on ws://127.0.0.1:9229/db309268-623a-4abe-b19a-c4407ed8998d 
  3. For help see https://nodejs.org/en/docs/inspector 

原理就是實現了 v8 debug protocol。

我們如果自己做調試工具、做 ide,那就要對接這個協議。

debugger adaptor protocol

上面介紹的 v8 debug protocol 可以實現 js 代碼的調試,那么 python、c# 等肯定也有自己的調試協議,如果要實現 ide,都要對接一遍太過麻煩。所以后來出現了一個中間層協議,DAP(debugger adaptor protocol)。

debugger adaptor protocol, 顧名思義,就是適配的,一端適配各種 debugger 協議,一端提供給客戶端統一的協議。這是適配器模式的一個很好的應用。

總結

本文我們學習了 debugger 的實現原理和暴露出的調試協議。

首先我們了解了代碼兩種運行方式:直接執行和解釋執行,然后分析了下為什么需要 debugger。

之后探索了直接執行的代碼通過 INT 3 的中斷的方式來實現 debugger 和解釋型語言自己實現的 debugger。

然后 debugger 的能力會通過 socket 暴露給客戶端,提供調試協議,比如 v8 debug protocol,各種客戶端包括 chrome devtools、ide 等都實現了這個協議。

但是每種語言都要實現一次的話太過麻煩,所以后來出現了一個適配層協議,屏蔽了不同協議的區別,提供統一的協議接口給客戶端用。

希望這篇文章能夠讓你理解 debugger 的原理,如果要實現調試工具也知道怎么該怎么去對接協議。能夠知道 chrome devtools、vscode 為啥都可以調試 nodejs 代碼。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2019-11-15 15:12:19

Windows激活KMS

2011-04-08 16:26:14

JavaScript

2010-10-09 15:31:51

JavaScriptCookie

2021-12-12 21:01:12

CSS 技巧PurgeCss

2023-04-11 16:13:44

JavaScripSymbol前端

2010-09-17 15:25:03

JAVAJVM

2009-10-23 13:32:34

.NET CRL

2024-08-07 09:22:57

2009-11-04 13:51:46

ADO.NET性能

2009-12-04 18:09:56

2020-09-22 08:52:50

平臺實現消息

2010-07-12 22:19:27

UDP服務

2022-10-13 13:21:58

系統httpsCharles

2024-10-10 17:46:06

2021-07-19 09:25:19

數據庫MySQL技術

2022-04-08 08:32:40

mobx狀態管理庫redux

2023-06-26 18:03:26

btrace 2.0開源

2025-06-12 05:00:00

@Autowired自動裝配實現機制

2023-03-06 07:43:05

JavaScripDebugger

2020-02-25 16:48:35

AndroidGoogle 移動系統
點贊
收藏

51CTO技術棧公眾號

日韩黄色片在线| 91在线在线观看| 强制高潮抽搐sm调教高h| 精品久久国产一区| 欧美日韩亚洲系列| 亚洲欧美在线网| 日韩在线观看视频网站| 青娱乐精品视频在线| 欧美日本在线视频中文字字幕| 欧美激情 亚洲| 精品美女一区| 日韩欧美大尺度| 8x8x华人在线| 91在线看片| 99精品久久久久久| 91探花福利精品国产自产在线| 欧美成人aaaaⅴ片在线看| 成人国产精品一级毛片视频| 亚洲国产精品中文| 一区二区久久精品| 韩国成人在线| 日韩欧美福利视频| 黄色一级片国产| 一区二区高清不卡| 久久久99精品免费观看| 成人黄动漫网站免费| 亚洲精品91天天久久人人| 国产精品激情电影| 伦伦影院午夜日韩欧美限制| 久久久久久国产免费a片| 老牛精品亚洲成av人片| 欧美一个色资源| 午夜免费看毛片| 亚洲成人激情社区| 色综合中文字幕| 成人毛片一区二区| 免费污视频在线| 亚洲精品日产精品乱码不卡| 亚洲视频在线观看日本a| 欧美日韩国产中文字幕在线| 99久久er热在这里只有精品15| 99re在线观看| 99视频免费看| 国产精品18久久久久久久久| 成人欧美一区二区三区在线| 欧美日韩在线视频播放| 日韩精品午夜视频| 国产ts一区二区| 久久久久在线视频| 日韩激情av在线| 国产精品www色诱视频| 亚洲色成人www永久网站| 日韩视频免费| 69精品小视频| 好看的av在线| 久久视频一区| 国产精品美乳在线观看| 中文字幕人妻丝袜乱一区三区| 日本色综合中文字幕| 国产精品久久久久久久久粉嫩av | 中文字幕亚洲电影| 一区二区三区免费看| 1769在线观看| 国产精品久久久久久久久果冻传媒 | 人妻无码一区二区三区久久99| 国产成人精品综合在线观看 | 99久久综合狠狠综合久久aⅴ| 中文字幕综合一区| 日韩av手机在线免费观看| 亚洲精品二区三区| 欧美激情视频给我| 超碰中文字幕在线| 日本v片在线高清不卡在线观看| 国产精品美女在线| 国产欧美综合视频| 成人午夜看片网址| 欧美日韩一区在线播放| 在线免费av网站| 精品国产一级毛片| 国产精品第13页| 今天免费高清在线观看国语| 国产黄色大片在线观看| 欧美性极品xxxx娇小| 妓院一钑片免看黄大片| 婷婷成人av| 欧美精品一区二区三| 精品无码在线视频| 日韩精品一区二区三区免费观影| 久久视频在线直播| 三级黄色在线视频| 久久99精品一区二区三区| 99一区二区| 欧美拍拍视频| 亚洲欧美日韩系列| 日韩精品视频久久| 99国内精品久久久久| 亚洲精品在线电影| 久操视频在线观看免费| 欧美精品二区| 午夜精品www| 中文字幕在线日亚洲9| 国产盗摄一区二区三区| 国产在线精品一区| 黄网站在线播放| 日韩欧美中文在线| avtt中文字幕| 手机在线电影一区| 欧美亚洲成人网| 国产成人精品亚洲精品色欲| 国产婷婷色一区二区三区在线| 久久免费一级片| 成人免费av电影| 亚洲国产精彩中文乱码av| 伊人久久久久久久久久久久久久| 97精品人妻一区二区三区香蕉| 亚洲成人手机在线观看| 又粗又黑又大的吊av| 久久久久亚洲av无码网站| 香蕉视频亚洲一级| 精品少妇一区二区三区视频免付费| xxxxx在线观看| 亚洲福利电影| 91亚洲国产成人久久精品网站| 欧美成人免费| 偷拍日韩校园综合在线| 免费观看黄网站| 最近中文字幕免费在线观看| 亚洲影院一区| 痴汉一区二区三区| 国产盗摄在线观看| 欧美色中文字幕| 成人免费网站黄| 一本久道久久久| 国产精品亚洲综合| 日日夜夜天天综合入口| 555夜色666亚洲国产免| 18精品爽国产三级网站| 日韩高清国产一区在线| 欧洲国产精品| 性欧美freesex顶级少妇| 亚洲成人精品av| 久久精品久久国产| 国产不卡高清在线观看视频| 国产精品无码乱伦| 韩国一区二区三区视频| 精品国产一区二区三区久久久狼 | 亚洲国产一区二区精品专区| 亚洲a级在线播放观看| 精品自拍一区| 91精品国产免费| 日韩a级片在线观看| 国产精品一区2区| 亚洲天堂第一区| 爱高潮www亚洲精品| 久久久人成影片一区二区三区| 亚洲国产精品国自产拍久久| 夜夜亚洲天天久久| 日本护士做爰视频| 亚洲视频大全| 日本在线观看一区二区三区| 午夜无码国产理论在线| 一区二区三区精品99久久| 在线免费看av的网站| 中文字幕在线一区| 在线观看一区二区三区视频| 国产综合自拍| 免费试看一区| 青青青国产精品| 欧美乱人伦中文字幕在线| 免费看av毛片| 一本色道久久综合精品竹菊| 四季av中文字幕| 国产一区二区0| 无码粉嫩虎白一线天在线观看| 欧美激情极品| 国产精品成人在线| 国产秀色在线www免费观看| 欧美一区二区三区喷汁尤物| 三级黄色在线视频| 中文一区在线播放| 蜜桃色一区二区三区| 一本色道久久综合一区 | 黑人一区二区三区四区五区| 精品综合在线| 久久亚洲资源中文字| 欧美激情手机在线视频| 欧美日韩免费做爰大片| 69堂精品视频| 亚洲黄色免费观看| 亚洲男女毛片无遮挡| 天堂久久久久久| 精品综合久久久久久8888| 男女日批视频在线观看| 欧美美女一区| 国产伦精品一区二区三区高清版 | 超碰资源在线| 色婷婷综合成人av| 五月婷婷在线播放| 91精品久久久久久久91蜜桃| 国产精品xxxx喷水欧美| 最新国产成人在线观看| 97超碰在线免费观看| 国产成人精品www牛牛影视| 青青青国产在线视频| 欧美日韩 国产精品| 婷婷久久五月天| 精品少妇一区| 亚洲精品免费在线视频| 亚洲伦乱视频| 97**国产露脸精品国产| wwwav在线| 亚洲天堂免费在线| 日韩一区二区三区在线观看视频| 欧美久久一二区| 在线观看国产亚洲| 一区二区三区高清在线| sm捆绑调教视频| 久久嫩草精品久久久精品一| 特级特黄刘亦菲aaa级| 精品一区二区三区在线播放| 国产一区二区视频免费在线观看| 亚洲性图久久| 中文精品无码中文字幕无码专区| 色综合色综合| 日韩国产高清一区| 香蕉视频一区二区三区| 极品尤物一区二区三区| 中文字幕亚洲在线观看| 成人免费看黄网站| 欧美成人家庭影院| 国产精品女人久久久久久| 日韩天堂在线| 国产成人精品午夜| 三级成人黄色影院| 欧美做爰性生交视频| 麻豆网站免费在线观看| 性色av一区二区三区| 国产伦子伦对白在线播放观看| 欧美激情极品视频| 日韩av官网| 欧美多人爱爱视频网站| 在线中文字幕视频观看| 欧美人在线视频| 欧美亚洲天堂| 欧美激情一区二区三区成人 | 久久久老熟女一区二区三区91| 国产福利一区二区| 深夜视频在线观看| 国产精品亚洲一区二区三区妖精 | 波多野结衣家庭教师在线播放| 在线欧美亚洲| 成人av一级片| 久久久噜噜噜| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 丝袜美腿高跟呻吟高潮一区| 白嫩少妇丰满一区二区| 日本成人在线一区| 日韩大片一区二区| 国产一区高清在线| 佐佐木明希电影| 91丨porny丨首页| 少妇无套高潮一二三区| 国产精品卡一卡二| 美女福利视频在线观看| 午夜日韩在线观看| 国产伦精品一区二区三区视频我| 色综合久久88色综合天天6| 国产成人精品亚洲| 91精品婷婷国产综合久久| 人妻无码一区二区三区久久99| 日韩精品在线免费| 秋霞午夜在线观看| 欧美激情第1页| 亚洲欧美一区二区三区| 国产精品视频在线观看| 人人爱人人干婷婷丁香亚洲| 国产欧美一区二区视频| 欧美精品系列| 国产精品视频网站在线观看| 一区二区三区福利| 波多结衣在线观看| 成人午夜碰碰视频| 亚洲一区二区自偷自拍| 亚洲精品国产一区二区三区四区在线 | 亚洲午夜激情影院| 成人午夜激情视频| 成人性生交大片免费看无遮挡aⅴ| 亚洲视频一二三| 久久久久亚洲av成人毛片韩| 69av一区二区三区| 久久米奇亚洲| 欧美日本高清一区| 成人在线观看免费播放| 国产伦精品一区二区三区高清版| 精品久久久亚洲| 欧美乱大交xxxxx潮喷l头像| 蜜桃视频在线观看一区| 日批在线观看视频| 综合久久国产九一剧情麻豆| 国产精品视频123| 日韩三级视频中文字幕| 第一福利在线| 91黄色8090| 国产日本亚洲| 亚洲欧美成人一区| 亚洲在线视频| 色欲欲www成人网站| 国产精品视频yy9299一区| 欧美成人精品欧美一级乱黄| 911精品产国品一二三产区| 国产资源在线播放| 久久全国免费视频| 成人国产精品久久| 亚洲成人蜜桃| 久久一综合视频| av无码一区二区三区| 亚洲欧美另类久久久精品2019| 日本欧美www| 亚洲美女av在线| 黑森林国产精品av| 99电影网电视剧在线观看| 婷婷丁香综合| 国产小视频精品| 久久久久久久久99精品| 日本五十熟hd丰满| 欧美va亚洲va香蕉在线| 蜜桃av在线免费观看| 国产精品久久久久一区二区| 亚洲国产最新| 欧美精品自拍视频| 成人一级黄色片| 国产在线视频在线观看| 精品国产乱码久久久久久老虎 | 人操人视频在线观看| 午夜精品久久久久久99热| 成人激情自拍| 国产精品www在线观看| 成人在线视频一区| 国产一级做a爱免费视频| 欧美成人aa大片| 好看的中文字幕在线播放| 国产精品10p综合二区| 欧美精品99| 美女伦理水蜜桃4| 亚洲成人免费视| 性高潮久久久久久久久久| 性视频1819p久久| 台湾佬综合网| 无人在线观看的免费高清视频| 久久久久久久久97黄色工厂| 超碰在线观看91| 中文字幕一区电影| www欧美在线观看| 一本大道东京热无码aⅴ| 成人手机电影网| 亚洲男人第一av| 亚洲欧美精品一区二区| 91在线成人| 最新国产精品久久| 国产成人亚洲综合a∨婷婷| 亚洲精品在线观看av| 日韩av影视综合网| 日本久久免费| 亚洲一区二区三区精品动漫| 国产在线日韩欧美| 国产在线视频第一页| 日韩经典第一页| 69堂免费精品视频在线播放| 中文字幕制服丝袜在线| 国产传媒欧美日韩成人| 日本网站在线播放| 国产亚洲激情在线| 日韩一区二区三区高清在线观看| 亚洲一区二区三区av无码| 91免费版在线看| 91在线观看喷潮| 久久久久久久久久婷婷| 九色成人国产蝌蚪91| 日韩av加勒比| 欧美日韩美女视频| 免费人成在线观看播放视频| 91精品国产沙发| 久久在线视频精品| 国产欧美另类| 国产成人免费观看| 亚洲1卡2卡3卡4卡乱码精品| 亚洲三级电影网站| 777久久久精品一区二区三区| 六月丁香婷婷久久| 精品视频在线观看免费| 亚洲免费福利视频| 国产精品美女久久久久人| 免费看黄在线看| 国产精品麻豆视频| 亚洲精品久久久久久无码色欲四季 | 亚洲成人一品| 亚洲免费成人在线视频| 精品久久久久久亚洲国产300| 日本视频在线观看| 久久99欧美|