1@page smarttrace 分析工具 SmartTrace 2 3**[更正文档](https://gitee.com/alios-things/documentation/edit/rel_3.3.0/debug-tools/smarttrace.md)**      **[贡献说明](https://help.aliyun.com/document_detail/302301.html)** 4 5# 使用目的 6- 接收日志和交互shell,取代串口工具 7- 自动解析栈回溯backtrace,替代手动addr2line 8- GDB常用调试功能,替代硬件仿真器 9 - 查看函数反汇编 10 - 查看地址反汇编 11 - 查看变量值等 12 13# 依赖组件 14* debug 15* cli 16 17# 操作步骤 18 191. 打开SmartTrace(windows版本和mac版本分开,这里以windows版本为例) 20 21<div align=left display=flex> 22 <img src="https://img.alicdn.com/imgextra/i1/O1CN01DtrUcH24Hg6euUzst_!!6000000007366-2-tps-803-743.png" style="max-width:800px;" /> 23</div> 24 25## 设置 26 272. 点击左上角 “设置”,加入elf 文件路径(当前只需加入kernel elf文件即可)和过滤规则文件 28 29<div align=left display=flex> 30 <img src="https://img.alicdn.com/imgextra/i3/O1CN01gAGgUk1jH7h3UUoWo_!!6000000004522-2-tps-1915-869.png" style="max-width:800px;" /> 31</div> 32 33 34其中,日志过滤文件和uTrace.exe在同一个路径下 35 36<div align=left display=flex> 37 <img src="https://img.alicdn.com/imgextra/i3/O1CN011my9nB1TrjV7Sna8K_!!6000000002436-2-tps-889-766.png" style="max-width:800px;" /> 38</div> 39 40## 日志 41点击“日志”标签,设置串口号,波特率,打开串口 42 43<div align=left display=flex> 44 <img src="https://img.alicdn.com/imgextra/i2/O1CN01S5IxsH1j2vPkf1NNd_!!6000000004491-2-tps-1908-1007.png" style="max-width:800px;" /> 45</div> 46 47 48可以看到设备日志,跟串口工具一样 49 50<div align=left display=flex> 51 <img src="https://img.alicdn.com/imgextra/i2/O1CN01zMZ78m1uBagRLYMbB_!!6000000005999-2-tps-1920-1041.png" style="max-width:800px;" /> 52</div> 53 54 55## 终端 56点击左上角“终端”,有个简易的shell,操作方式跟串口工具一样,**这里是把AliOS Things cli 命令的输出,从日志里拿出来,输出到了这个“终端”标签下,**方便进行一些命令的调试。 57 58<div align=left display=flex> 59 <img src="https://img.alicdn.com/imgextra/i3/O1CN01gSpkvT1iCiGUOrYkl_!!6000000004377-2-tps-1920-1041.png" style="max-width:800px;" /> 60</div> 61 62# 查看栈回溯backtrace 63 64 65## 直接解析日志中的backtrace 66如果使用SmartTrace工具接上了串口,则在系统异常crash的时候会直接解析调用栈(右侧的解析窗口默认情况下是隐藏的,将光标移到右侧,光标图案变成左右箭头的时候,点击并往左拖动,可以拖出来“过滤日志窗口”。注意,在右边还有一个“Sequence Diagram”窗口,可查看时序图,这里暂时可以不管) 67 68<div align=left display=flex> 69 <img src="https://img.alicdn.com/imgextra/i1/O1CN01HNx9NR1Sru1yNyhe3_!!6000000002301-2-tps-1890-1004.png" style="max-width:800px;" /> 70</div> 71 72## 从其他地方复制backtrace并解析 73如果日志来源于其他地方,如调试串口工具secureCRT,如果此时想查看栈回溯,复制完整的栈回溯信息 74(“Kernel Call stack”栈信息是必要的) 75 76<div align=left display=flex> 77 <img src="https://img.alicdn.com/imgextra/i2/O1CN01W15ku71mi5racVdbJ_!!6000000004987-2-tps-982-914.png" style="max-width:800px;" /> 78</div> 79 80使用“本地日志” --- “clipboard” --- “**分析日志**”, 也可以解析调用栈 81 82<div align=left display=flex> 83 <img src="https://img.alicdn.com/imgextra/i4/O1CN0186eqDH1zhG99TXySp_!!6000000006745-2-tps-1908-1003.png" style="max-width:800px;" /> 84</div> 85 86# GDB调试功能 87## 查看反汇编 $disass 命令 88### `$disass function`:查看指定函数的反汇编 89 90 91如:查看cli_main接口的反汇编 92$disass cli_main 93工具会输出cli_main 函数的反汇编 94 95<div align=left display=flex> 96 <img src="https://img.alicdn.com/imgextra/i2/O1CN01VFFS9626FVSSVnavT_!!6000000007632-2-tps-1920-1041.png" style="max-width:800px;" /> 97</div> 98 99### `$disass memory_address`:查看指定地址的反汇编 100 101 102如:查看crash时PC的反汇编,从日志看得知PC=0x10057D40 103$disass 0x10057D40 104工具会输出 105 106<div align=left display=flex> 107 <img src="https://img.alicdn.com/imgextra/i1/O1CN01mOjXgc1lIcDHRtGY3_!!6000000004796-2-tps-573-201.png" style="max-width:800px;" /> 108</div> 109 110 111## 查看变量 112查看 g_ready_queue结构体数据 113$p g_ready_queue 114会输出: 115 116<div align=left display=flex> 117 <img src="https://img.alicdn.com/imgextra/i1/O1CN018P0Z6S297D8GD2iV1_!!6000000008020-2-tps-719-693.png" style="max-width:800px;" /> 118</div> 119 120 121<div align=left display=flex> 122 <img src="https://img.alicdn.com/imgextra/i3/O1CN01iUfd0b21FtiPRM4sB_!!6000000006956-2-tps-677-453.png" style="max-width:800px;" /> 123</div> 124 125 126## 当前支持的GDB命令汇总 127 128- `$p variable`:打印变量variable的值 129- `$p *(pointer_type *)memory_address`:按指定的数据类型读取内存数据并打印 130- `$p &variable`:打印变量variable的地址 131- `$x /nwx memory_address`:查看指定地址的内存数据,其中n表示数字,用1~9代替 132- `$set variable=value`:设置某个变量的值为value 133- `$set *(pointer_type *)memory_address`=value`:设置某个内存地址的值为value 134- `$disass function`:查看指定函数的反汇编代码 135- `$disass memory_address`:查看指定地址的反汇编代码 136 137 138 139注:更多高级功能在持续演进。 140 141 142# 附件 143当前仅支持 windows 和 mac 环境,均在zip包里,无需安装,选择相应版本下载即可使用