SlideShare a Scribd company logo
JavaScript
现代化排错实践
   赵劼 - 2012.9
关于我
• 赵劼 / ⽼老赵 / Jeffrey Zhao / 赵姐夫
• ⽇日写代码三百⾏行,不辞⻓长作程序员
• 博客:http://blog.zhaojie.me/
• 微博:@⽼老赵
• F#, JavaScript, Scala, C#, Python, .NET, Mono...
• 痛恨Java语⾔言
内容提纲

• 代码调试检查
• 调⽤用堆栈分析
• 调试混淆代码
 •   Source Map
代码调试
代码调试

• 很久很久以前:alert
• 过了⼀一段时间:console.log
• 其实从IE 5时代开始便可以调试代码
两个问题


• Node.js可以调试吗?
• eval出来的代码可以调试吗?
调试Node.js代码

• Eclipse
• Eclipse Debugger Plugin for V8
• 启动程序
 • node	
  -­‐-­‐debug[=port]	
  app.js
 • node	
  -­‐-­‐debug-­‐brk[=port]	
  app.js


                                        Using Eclipse as Node Applications Debugger
调试eval的代码

• 代码末尾://@	
  sourceUrl=<path>
• ⽀支持浏览器
 •   Chrome
 •   Safari
 •   Firefox (Firebug)
调⽤用堆栈分析
调⽤用堆栈
命名函数表达式

//	
  函数定义
function	
  Identifier(FormalParameterListopt)	
  {	
  FunctionBody	
  }



//	
  函数表达式
function	
  Identifieropt(FormalParameterListopt)	
  {	
  FunctionBody	
  }




                                                                     命名函数表达式探秘
分辨⼀一下
//	
  声明:程序的⼀一部分
function	
  foo()	
  {	
  };

//	
  表达式:分组操作符中只能包含表达式
(function	
  foo()	
  {	
  });

//	
  表达式:赋值表达式(AssignmentExpression)的⼀一部分
var	
  bar	
  =	
  function	
  foo()	
  {	
  };

//	
  表达式:New表达式(NewExpression)的⼀一部分
new	
  function	
  bar()	
  {	
  };

(function	
  ()	
  {
	
  	
  	
  	
  //	
  声明:函数体(FunctionBody)的⼀一部分
	
  	
  	
  	
  function	
  bar()	
  {	
  };
})();
调试混淆代码
调试混淆代码
格式化以后
配合Source Map
Source Map

• 记录⺫⽬目标代码到源代码的映射
• JSON格式 + 编码后的映射数据
• Source Map V3 Spec
Source Map

  • 记录⺫⽬目标代码到源代码的映射
  • JSON格式 + 编码后的映射数据
  • Source Map V3 Spec
脚本末尾加上://@	
  sourceMappingURL=<path>,或
脚本请求头加上:X-­‐SourceMap:	
  <path>
深⼊入Source Map
Source Map V3
{
	
  	
  	
  	
  "version":	
  3,
	
  	
  	
  	
  "file":	
  "all.min.js",
	
  	
  	
  	
  "lineCount":	
  37,
	
  	
  	
  	
  "sources":	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  "wind-­‐core.js",
	
  	
  	
  	
  	
  	
  	
  	
  "wind-­‐builderbase.js",
	
  	
  	
  	
  	
  	
  	
  	
  "wind-­‐async.js",
	
  	
  	
  	
  	
  	
  	
  	
  "sorting-­‐animations.aot.js"
	
  	
  	
  	
  ],
	
  	
  	
  	
  "names":	
  [	
  "Wind",	
  "_",	
  "isArray",	
  "obj",	
  ...	
  ],
	
  	
  	
  	
  "mappings":	
  "AAAC,SAAS,EAAG,CAGT,IAAIA,	
  ..."
}
解码 mappings 字段

• ⽤用分号区分“⾏行”,逗号区分“段”。
• Base64 Variable-Length Quantity 编码
• 节省空间,⽐比V2节省50%左右
确定代码⾏行号

AABBC;	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  第1⾏行
KAUYM,GAKoEF;	
  	
  //	
  第2⾏行
CCDD,	
  ...;	
  	
  	
  	
  	
  //	
  第3⾏行
...
...
Base64 VLQ解码
KAUYM,GAKoEF
Base64 VLQ解码
KAUYM,GAKoEF
        >>




[10,	
  0,	
  20,	
  24,	
  12],	
  [6,	
  0,	
  10,	
  40,	
  4,	
  5]
Base64 VLQ解码
KAUYM,GAKoEF
        >>




[10,	
  0,	
  20,	
  24,	
  12],	
  [6,	
  0,	
  10,	
  40,	
  4,	
  5]
        >>




[001010,	
  000000,	
  010100,	
  011000,	
  001100],	
  
[000110,	
  000000,	
  001010,	
  101000,	
  000100,	
  000101]
Base64 VLQ解码
KAUYM,GAKoEF
        >>




[10,	
  0,	
  20,	
  24,	
  12],	
  [6,	
  0,	
  10,	
  40,	
  4,	
  5]
        >>




                                            最低N-­‐1位为数据位
[001010,	
  000000,	
  010100,	
  011000,	
  001100],	
  
                                   01000,	
  	
  00100
[000110,	
  000000,	
  001010,	
  101000,	
  000100,	
  000101]
                                          最⾼高位表⽰示是否“连接后续数据”
Base64 VLQ解码
KAUYM,GAKoEF
        >>




[10,	
  0,	
  20,	
  24,	
  12],	
  [6,	
  0,	
  10,	
  40,	
  4,	
  5]
        >>




                                            最低N-­‐1位为数据位
[001010,	
  000000,	
  010100,	
  011000,	
  001100],	
  
                                   01000,	
  	
  00100
[000110,	
  000000,	
  001010,	
  101000,	
  000100,	
  000101]
                                          最⾼高位表⽰示是否“连接后续数据”
        >>




[1010,	
  0,	
  10100,	
  11000,	
  1100],	
  
[110,	
  0,	
  1010,	
  10001000,	
  101]
数据解码
[1010,	
  0,	
  10100,	
  11000,	
  1100],	
  
[110,	
  0,	
  1010,	
  10001000,	
  101]
数据解码
[1010,	
  0,	
  10100,	
  11000,	
  1100],	
  
[110,	
  0,	
  1010,	
  10001000,	
  101]
            最⾼高N-­‐1位为数据位              最低位为符号位
数据解码
[1010,	
  0,	
  10100,	
  11000,	
  1100],	
  
[110,	
  0,	
  1010,	
  10001000,	
  101]
               最⾼高N-­‐1位为数据位                    最低位为符号位
     >>




[5,	
  0,	
  10,	
  12,	
  6],	
  [3,	
  0,	
  5,	
  68,	
  -­‐2]
数据解码
[1010,	
  0,	
  10100,	
  11000,	
  1100],	
  
[110,	
  0,	
  1010,	
  10001000,	
  101]
               最⾼高N-­‐1位为数据位                    最低位为符号位
     >>




[5,	
  0,	
  10,	
  12,	
  6],	
  [3,	
  0,	
  5,	
  68,	
  -­‐2]
     >>




[5,	
  0,	
  10,	
  12,	
  6],	
  [8,	
  0,	
  15,	
  80,	
  4]
含义

//	
  已确定⾏行号
[
	
  5,	
  	
  	
  //	
  列号
	
  0,	
  	
  	
  //	
  源⽂文件,从sources查找
	
  10,	
  	
  //	
  源⽂文件内⾏行号
	
  12,	
  	
  //	
  源⽂文件内列号
	
  6	
  	
  	
  	
  //	
  源⽂文件内标⽰示符,从names查找
]
⽆无需⼿手动分析

• Google Closure Compiler可以⽣生成V2版
 Source Map格式,未编码的明⽂文数据

• 使⽤用Mozilla的SourceMap项⺫⽬目读取或⽣生成
 Source Map⽂文件
总结

• 使⽤用调试器辅助JavaScript开发
 •   即使是eval⽣生成的代码也没有问题

• 使⽤用命名函数表达式来美化堆栈
• 使⽤用Source Map来调试混淆后的代码
 •   ⼿手动使⽤用Source Map亦不是问题
Q &A
谢谢

More Related Content

What's hot (20)

PDF
Jscex:案例、阻碍、体会、展望
jeffz
 
PDF
在開始工作以前,我以為我會寫扣。
Chih-Hsuan Kuo
 
PDF
Python 于 webgame 的应用
勇浩 赖
 
PDF
nodeMCU IOT教學02 - Lua語言
吳錫修 (ShyiShiou Wu)
 
PDF
LazyRecord: The Fast ORM for PHP
Lin Yo-An
 
PDF
Python learn guide
robin yang
 
PDF
Sigreturn Oriented Programming
Angel Boy
 
PPTX
Ian 20151002 es2015
LearningTech
 
PDF
Node.js开发体验
QLeelulu
 
PPT
C程式-函式與巨集
艾鍗科技
 
PDF
OpenEJB - 另一個選擇
Justin Lin
 
PDF
Talking about exploit writing
sbha0909
 
PPT
C程式-陣列與指標
艾鍗科技
 
PDF
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
PDF
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
PDF
JavaScript 教程
Bobby Zhou
 
PDF
Standford 2015 iOS讀書會 week2: 1. Applying MVC 2. More Swift and Foundation Fra...
彼得潘 Pan
 
PPTX
PHPUnit + Xdebug 单元测试技术
hoopchina
 
PPT
改善程序设计技术的50个有效做法
crasysatan
 
PPTX
异步编程与浏览器执行模型
keelii
 
Jscex:案例、阻碍、体会、展望
jeffz
 
在開始工作以前,我以為我會寫扣。
Chih-Hsuan Kuo
 
Python 于 webgame 的应用
勇浩 赖
 
nodeMCU IOT教學02 - Lua語言
吳錫修 (ShyiShiou Wu)
 
LazyRecord: The Fast ORM for PHP
Lin Yo-An
 
Python learn guide
robin yang
 
Sigreturn Oriented Programming
Angel Boy
 
Ian 20151002 es2015
LearningTech
 
Node.js开发体验
QLeelulu
 
C程式-函式與巨集
艾鍗科技
 
OpenEJB - 另一個選擇
Justin Lin
 
Talking about exploit writing
sbha0909
 
C程式-陣列與指標
艾鍗科技
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
JavaScript 教程
Bobby Zhou
 
Standford 2015 iOS讀書會 week2: 1. Applying MVC 2. More Swift and Foundation Fra...
彼得潘 Pan
 
PHPUnit + Xdebug 单元测试技术
hoopchina
 
改善程序设计技术的50个有效做法
crasysatan
 
异步编程与浏览器执行模型
keelii
 

Viewers also liked (20)

PPT
Ruby Past, Present, Future
adamfine
 
PDF
大话程序员可用的算法
jeffz
 
PDF
Web开发中的缓存
jeffz
 
PDF
LINQ Inside
jeffz
 
PDF
企业开发领域的语言特性
jeffz
 
PDF
分布式版本管理
jeffz
 
PPTX
QML 與 C++ 的美麗邂逅
Jack Yang
 
PDF
Rabbit mq簡介(上)
共和 薛
 
PDF
Storm特性
zyh
 
PDF
鐵道女孩向前衝-RubyKaigi心得分享
Yu-Chen Chen
 
PDF
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
International Federation for information integration
 
PDF
使用.NET构建轻量级分布式框架
jeffz
 
PDF
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
Taipei Smart City PMO
 
PDF
我編譯故我在:誰說 Node.js 程式不能編成 binary
Fred Chien
 
PPTX
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
International Federation for information integration
 
PDF
Brig:Node.js + QML 華麗大冒險
Fred Chien
 
PDF
計概:Programming Paradigm
Rex Yuan
 
PPTX
新時代圖書館大未來
Ted Lin (林泰宏)
 
PDF
超酷炫科幻 UI:QML 入門
Fred Chien
 
PDF
試看VR的教育輕應用
Wayne Huang
 
Ruby Past, Present, Future
adamfine
 
大话程序员可用的算法
jeffz
 
Web开发中的缓存
jeffz
 
LINQ Inside
jeffz
 
企业开发领域的语言特性
jeffz
 
分布式版本管理
jeffz
 
QML 與 C++ 的美麗邂逅
Jack Yang
 
Rabbit mq簡介(上)
共和 薛
 
Storm特性
zyh
 
鐵道女孩向前衝-RubyKaigi心得分享
Yu-Chen Chen
 
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
International Federation for information integration
 
使用.NET构建轻量级分布式框架
jeffz
 
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
Taipei Smart City PMO
 
我編譯故我在:誰說 Node.js 程式不能編成 binary
Fred Chien
 
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
International Federation for information integration
 
Brig:Node.js + QML 華麗大冒險
Fred Chien
 
計概:Programming Paradigm
Rex Yuan
 
新時代圖書館大未來
Ted Lin (林泰宏)
 
超酷炫科幻 UI:QML 入門
Fred Chien
 
試看VR的教育輕應用
Wayne Huang
 
Ad

Similar to JavaScript现代化排错实践 (13)

PDF
Sourcemap
allenmeng
 
PPTX
Groovy Introduction for Java Programmer
Li Ding
 
PPT
第7章 语法制导翻译和中间代码生成
tjpucompiler
 
PDF
getPDF.aspx
byron zhao
 
PDF
getPDF.aspx
byron zhao
 
PPT
第11章 目标代码生成
tjpucompiler
 
PDF
Clojure and FP
Qin Jian
 
PPT
Scala
deathxlent
 
PPT
Hi Haskell
Jifeng Deng
 
PPTX
Ecma script edition5-小试
lydiafly
 
PPT
Lua 语言介绍
gowell
 
PDF
Js对象及函数式编程乱步
Pierre Woo
 
PDF
Learning python in the motion picture industry by will zhou
Will Zhou
 
Sourcemap
allenmeng
 
Groovy Introduction for Java Programmer
Li Ding
 
第7章 语法制导翻译和中间代码生成
tjpucompiler
 
getPDF.aspx
byron zhao
 
getPDF.aspx
byron zhao
 
第11章 目标代码生成
tjpucompiler
 
Clojure and FP
Qin Jian
 
Scala
deathxlent
 
Hi Haskell
Jifeng Deng
 
Ecma script edition5-小试
lydiafly
 
Lua 语言介绍
gowell
 
Js对象及函数式编程乱步
Pierre Woo
 
Learning python in the motion picture industry by will zhou
Will Zhou
 
Ad

More from jeffz (20)

PDF
深入浅出Jscex
jeffz
 
PDF
Mono for .NET Developers
jeffz
 
PDF
Javascript Uncommon Programming
jeffz
 
PDF
Jscex: Write Sexy JavaScript (中文)
jeffz
 
PDF
Jscex: Write Sexy JavaScript
jeffz
 
PDF
单点登录解决方案的架构与实现
jeffz
 
PDF
Documentation Insight技术架构与开发历程
jeffz
 
PDF
Windows Phone应用开发心得
jeffz
 
PDF
针对iPad平台的高性能网站架构
jeffz
 
PDF
The Evolution of Async-Programming on .NET Platform (TUP, Full)
jeffz
 
PDF
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
jeffz
 
PDF
The Evolution of Async-Programming (SD 2.0, JavaScript)
jeffz
 
PDF
面向对象与生活
jeffz
 
PDF
Windows内核技术介绍
jeffz
 
PDF
响应式编程及框架
jeffz
 
PDF
F#语言对异步程序设计的支持
jeffz
 
PDF
大众点评网的技术变迁之路
jeffz
 
PDF
Better Framework Better Life
jeffz
 
PDF
Why Java Sucks and C# Rocks (Final)
jeffz
 
PDF
如何成为一名优秀的博主
jeffz
 
深入浅出Jscex
jeffz
 
Mono for .NET Developers
jeffz
 
Javascript Uncommon Programming
jeffz
 
Jscex: Write Sexy JavaScript (中文)
jeffz
 
Jscex: Write Sexy JavaScript
jeffz
 
单点登录解决方案的架构与实现
jeffz
 
Documentation Insight技术架构与开发历程
jeffz
 
Windows Phone应用开发心得
jeffz
 
针对iPad平台的高性能网站架构
jeffz
 
The Evolution of Async-Programming on .NET Platform (TUP, Full)
jeffz
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
jeffz
 
The Evolution of Async-Programming (SD 2.0, JavaScript)
jeffz
 
面向对象与生活
jeffz
 
Windows内核技术介绍
jeffz
 
响应式编程及框架
jeffz
 
F#语言对异步程序设计的支持
jeffz
 
大众点评网的技术变迁之路
jeffz
 
Better Framework Better Life
jeffz
 
Why Java Sucks and C# Rocks (Final)
jeffz
 
如何成为一名优秀的博主
jeffz
 

JavaScript现代化排错实践