gdb调试
gdb FILE 调试程序
gdb run 运行程序
gdb list 查看代码
break num 设置断点
breac function
info b 查看断点
delete b 删除断点
break operator(函数名) 条件断点
step 单步
next 往下执行
finish 退出函数
info program 来查看程序的是否在运行,进程号,被暂停的原因
continue 继续运行程序,可简写为c
display varible 检查变量
print varible 打印变量
set varible = 改变数据
backtrace 检查堆栈
b file:num thread 5
info threads
until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u
thread num 指定线程
set scheduler-locking on/off 锁定调度器来避开gdb根据优先权来改变当前线程
thread apply all 指定线程应用命令
attach pid 挂接进程
dettach pid 脱离进程
watch 监控变量改变
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
方法一:适合临时向文件输出些信息的情况。
比如要用info functions输出所有函数,结果往往有一大坨,所以可以将之输出到文件。
(gdb) set logging file <file name>
(gdb) set logging on
(gdb) info functions
(gdb) set logging off
方法二:适合整个gdb会话期间都重定向输出的情况。
gdb |tee newfile
show directories
查看源代码路径
dir dirname
将dirname加到代码搜索路径里面
静态库(.a, .lib) 和动态库(.so, .dll)
是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
ar -crv libstaticmath.a StaticMath.o
g++ TestStaticLibrary.cpp -L 路径 -lstaticmath
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦
g++ -fPIC -c DynamicMath.cpp
g++ -shared -o libdynmath.so DynamicMath.o
g++(gcc)编译选项l -shared :指定生成动态链接库。
l -static :指定生成静态链接库。
l -fPIC :表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码, 念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。
l -L. :表示要连接的库所在的目录。
l -l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a/.so来确定库的名称。
l -Wall :生成所有警告信息。
l -ggdb :此选项将尽可能的生成gdb 的可以使用的调试信息。
l -g :编译器在编译的时候产生调试信息。
l -c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件) 。
l -Wl,options :把参数(options)传递给链接器ld 。如果options 中间有逗号,就将options分成多个选项,然后传递给链接程序。
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
浙公网安备 33010602011771号