Categories
程式開發

如何優雅的使用GDB調試Go



{“ type”:“ doc”,“ content”:[{“type”:”blockquote”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”Tips: all for hands-free.”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”Tips 系列:记录日常解决问题、解放双手的一些小技巧。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”目的只有一个:不被重复的琐事麻痹,能偷懒的绝不手软。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ horizo​​ntalrule” },{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”今天聊聊如何优雅的使用GDB调试Go程序。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”GDB有啥用?”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”想了解代码底层的话,它是一大利器,更别说定位问题啥的。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”具体骚操作见曹大的”},{“type”:”link”,”attrs”:{“href”:”https://xargin.com/debugger/”,”title”:null},”content”:[{“type”:”text”,”text”:”使用 debugger 学习 golang”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”但GDB从安装到可用,可能有一大堆问题要解决(尤其在Mac上),我们怎么能优雅的使用它,避免陷入问题中,是本文的重点。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”(涉及Docker和Mac两个平台上运行)”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”先来看比较推荐的Docker方式”}]},{“ type”:“標題”,“ attrs”:{“ align”:null,“ level”:2},“ content”:[{“type”:”text”,”text”:”Docker篇:3步即可调试”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”docker加持的话,非常方便,随用随起”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”先上效果:戳 “},{“type”:”link”,”attrs”:{“href”:”https://asciinema.org/a/302911″,”title”:null},”content”:[{“type”:”text”,”text”:”gdb-debug-go-in-docker”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph”,“ attrs”:{“ indent”: 0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”具体步骤如下:(完全回归工具本质,换台机器也能调试)”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ codeblock” ,“ attrs”:{“ lang”:“ shell”},“ content”:[{“type”:”text”,”text”:”// 1. 已当前目录映射启动gdbndocker run –rm -it –security-opt=”apparmor=unconfined” \n –security-opt=”seccomp=unconfined” \n –cap-add=SYS_PTRACE -v “$(pwd):/go/src/app” \n newbmiao/gdb-go:1.14 bashnn// 2. 编译go,不使用compressdwarf 、inline and escapengo build -ldflags=-compressdwarf=false -gcflags=all=”-N -l” -o test test.gonn// 3. 可以愉快的debug了ngdb ./test”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”一套打完,收工,就这么简单。文末会附上怎么定义的docker。”}]},{“ type”:“ horizo​​ntalrule”},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null} ,“內容”:[{“type”:”text”,”text”:”你可能有疑问,docker这些参数是干啥的,下边附资料,感兴趣自行查看”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ blockquote” ,“內容”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”具体讨论见issue:”},{“type”:”link”,”attrs”:{“href”:”https://github.com/moby/moby/issues/7276#issuecomment-194137403″,”title”:null},”content”:[{“type”:”text”,”text”:”apparmor denies ptrace to docker-default profile”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”AppArmor”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”AppArmor 是一个 Linux 内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特定功能,例如网络访问或文件读/写/执行权限。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”详见”},{“type”:”link”,”attrs”:{“href”:”https://docs.docker.com/engine/security/apparmor/”,”title”:null},”content”:[{“type”:”text”,”text”:”AppArmor security profiles for Docker”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”Seccomp”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”Seccomp是Secure computing mode的缩写,它是Linux内核提供的一个操作,用于限制一个进程可以执行的系统调用.当然,我们需要有一个配置文件来指明进程到底可以执行哪些系统调用,不可以执行哪些系统调用.在Docker中,它使用Seccomp来限制一个容器可以执行的系统调用。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”详见”},{“type”:”link”,”attrs”:{“href”:”https://docs.docker.com/engine/security/seccomp/”,”title”:null},”content”:[{“type”:”text”,”text”:”Seccomp security profiles for Docker”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”SYS_PTRACE”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”配合”},{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”seccomp=unconfined”}]},{“ type”:“ text”,“ text”:“,允許容器使用ptrace運行strace / ltrace之類的程序。”}]},{“ type”:“標題”,“ attrs”:{“ align”:null,“ level”:2},“ content”:[{“type”:”text”,”text”:”Mac篇:需要证书签名”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”版本: “},{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”gdb 8.3.1″}]},{“ type”:“文本”,“ text”:“打開”},{“ type”:“ codeinline”,“內容”:[{“type”:”text”,”text”:”macoOS High Serria 10.13.6″}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”步骤:”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”创建系统证书 “},{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”gdb-cert”}]}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”重点是标红处,其他一路下一步即可。(注意证书创建成功,才能签名成功)”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”link”,”attrs”:{“href”:”http://media.newbmiao.com/tips/gdb-codesign.gif”,”title”:”创建系统证书”}},{“type”:”text”,”text”:”创建系统证书”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”(如果创建失败,可以”},{“type”:”text”,”marks”:[{“type”:”strong”}],“文本”:“刪除證書,重啟創建”},{“類型”:“文本”,“文本”:“(推薦);或者嘗試創建登錄證書=》導出=》 =》加載到系統證書)” }]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”gdb代码签名”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”已创建脚本,直接执行:”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”sh debugger/gdb/installMac.sh”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”gdb调试(方式同docker篇)”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ blockquote” ,“內容”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”证书相关具体参见:”},{“type”:”link”,”attrs”:{“href”:”https://sourceware.org/gdb/wiki/PermissionsDarwin#Create_a_certificate_in_the_System_Keychain”,”title”:null},”content”:[{“type”:”text”,”text”:”PermissionsDarwin”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”同样列一下可能遇到的问题:”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”codesign”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ codeblock” ,“ attrs”:{“ lang”:“ shell”},“ content”:[{“type”:”text”,”text”:”Unable to find Mach task port for process-id 3884: (os/kern) failure (0x5).n (please check gdb is codesigned – see taskgated(8))”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”初次运行卡住”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ codeblock” ,“ attrs”:{“ lang”:“ shell”},“ content”:[{“type”:”text”,”text”:”$ gdb ./testn>>> rnStarting program: /Users/newbmiao/Documents/tech/Dig101-Go/testn[New Thread 0xd03 of process 7603] n#卡住。。。“}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”解决方法:”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”直接别的窗口找到对应进程id,kill掉,后续会正常”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ codeblock” ,“ attrs”:{“ lang”:“ shell”},“ content”:[{“type”:”text”,”text”:”ps aux|grep gdbnkill -9 xxx”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist”,“ content”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”SIG113问题”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”详见:”},{“type”:”link”,”attrs”:{“href”:”https://github.com/cyrus-and/gdb-dashboard/issues/81″,”title”:null},”content”:[{“type”:”text”,”text”:”GDB kind of doesn’t work on macOS Sierra”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”解决方法:”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ codeblock” ,“ attrs”:{“ lang”:“ shell”},“ content”:[{“type”:”text”,”text”:”# gdb 的配置n$ cat ~/.gdbinitn# gdb-dashboardn// $ cat ~/.gdbinit.d/initnset startup-with-shell off”}]},{“ type”:“項目列表”,“ content”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”让gdb更理解go的调试信息”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”让gdb打印更易读,不压缩dwarf”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”go build -ldflags=-compressdwarf=false -gcflags=all=”-N -l” -o test test.go”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”gdb使用 “},{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”$GOROOT/src/runtime/runtime-gdb.py”}]},{“ type”:“ text”,“ text”:“來加載go運行時支持。”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”可以从二进制文件中查看到: “},{“type”:”codeinline”,”content”:[{“type”:”text”,”text”:”strings test |grep gdb”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”libsystem_darwin.dylib错误”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”直接忽略就行,详见:”},{“type”:”link”,”attrs”:{“href”:”https://stackoverflow.com/questions/58125727/gdb-giving-weird-errors”,”title”:null},”content”:[{“type”:”text”,”text”:”GDB giving weird errors”}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ blockquote” ,“內容”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”详细代码见”},{“type”:”link”,”attrs”:{“href”:”https://github.com/NewbMiao/free-hands-tips#gdb-go”,”title”:null},”content”:[{“type”:”text”,”text”:”NewbMiao/free-hands-tips”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ paragraph” ,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null},“ content”:[{“type”:”text”,”text”:”See more:”}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ bulletedlist” ,“內容”:[{“type”:”listitem”,”content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”link”,”attrs”:{“href”:”https://github.com/cyrus-and/gdb-dashboard”,”title”:null},”content”:[{“type”:”text”,”text”:”cyrus-and/gdb-dashboard”}]}]}]},{“ type”:“ listitem”,“ content”:[{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”link”,”attrs”:{“href”:”https://golang.org/doc/gdb”,”title”:null},”content”:[{“type”:”text”,”text”:”Debugging Go Code with GDB”}]}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}},{“ type”:“ blockquote” ,“內容”:[{“type”:”image”,”attrs”:{“src”:”https://static001.geekbang.org/infoq/84/84d4873d3f485b2060bd287c202b50f9.jpeg”,”alt”:null,”title”:null,”style”:null,”href”:null,”fromPaste”:true,”pastePass”:true}},{“type”:”paragraph”,”attrs”:{“indent”:0,”number”:0,”align”:null,”origin”:null},”content”:[{“type”:”text”,”text”:”本文链接 : “},{“type”:”link”,”attrs”:{“href”:”http://blog.newbmiao.com/2020/02/18/tips-use-gdb-elegantly.html”,”title”:”http://blog.newbmiao.com/2020/02/18/tips-use-gdb-elegantly.html”},”content”:[{“type”:”text”,”text”:”http://blog.newbmiao.com/2020/02/18/tips-use-gdb-elegantly.html”}]}]}]},{“ type”:“ paragraph”,“ attrs”:{“ indent”:0,“ number”:0,“ align”:null,“ origin”:null}}}

}