lldb

xcode里有内置的Debugger,老版使用的是GDB,xcode自4.3之后默认使用的就是LLDB了。



GDB:
UNIX及UNIX-like下的调试工具。
LLDB:
LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。

LLDB的常用命令:
1> po:打印对象,会调用对象 description 方法。是 print-object 的简写;命令po跟p很像,p输出的是基本类型,po输出的Objective-C对象。调试器会输出这个 object 的 description。



2> expr:可以在调试时动态执行指定表达式,并将结果打印出来,很有用的命令



3> print:也是打印命令,需要指定类型



4> bt:打印调用堆栈,是 thread backtrace 的简写,加 all 可打印所有thread 的堆栈



5> br l:是 breakpoint list 的简写



6> n:是换行



7> p:是打印这个对象所属的类,即其父类



https://redirector.gvt1.com/edgedl/go/go1.9.2.src.tar.gz
https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz



编译go之前需要设置环境变量,
GOROOT_BOOTSTRAP是go二进制文件夹的所在目录,
GO_GCFLAGS是编译go时使用的参数.



export GOROOT_BOOTSTRAP=~/git_go/go_bin
export GO_GCFLAGS=”-N -l”
这里的-N参数代表禁止优化, -l参数代表禁止内联, go在编译目标程序的时候会嵌入运行时(runtime)的二进制,
禁止优化和内联可以让运行时(runtime)中的函数变得更容易调试.



都准备好以后就可以进入go的源代码文件夹执行all.bash编译了:
编译源代码使用以下命令, 这里的-l参数的意思和上面一样, 如果有需要还可以加-N参数:



~/git_go/go_src/bin/go build -gcflags “-l” hello.go
编译后使用lldb运行:



lldb ./hello
go里面的函数符号名称的命名规则是包名称.函数名称, 例如主函数的符号名称是main.main, 运行时中的newobject的符号名称是runtime.newobject.



https://golang.org/doc/gdb
http://lldb.llvm.org/


Category golang