nm^ar^gcc^gdb^make 重点
HBC_DongFengZaiQi 2011-03-18 11:40
nm -a /usr/local/ossasn1/linux-glibc2.2.trial/8.5.0/lib/libasn1code.a (| grep -i symbol)
ar -t /usr/local/ossasn1/linux-glibc2.2.trial/8.5.0/lib/libasn1code.a
gcc
-E:预处理完成后停止编译,生产.i文件
-c:将文件编译为目标代码,不链接
-Wall:产生尽可能多的警告信息
-Werror:把所有警告当成错误处理,并终止编译
-w:禁止所有报警
-g(3):把调试信息加到可执行文件,便于调试,不能与-O同时使用
On most systems that use stabs format, -g enables use of extra debugging information that only GDB can use; this extra information makes debugging work better in GDB but will probably make otherdebuggers crash or refuse to read the program. If you want to control for certain whether to generate the extra information, use -gstabs+, -gstabs, -gxcoff+, -gxcoff, -gdwarf-1+, -gdwarf-1, or -gvms
-On:控制代码优化, n=0,1,2,3
通常-O2用的较多,因为它在优化程度,编译时间和代码大小间取得了比较理想的平衡
gcc在链接时优先使用动态链接库,当动态链接库不存在时,才考虑静态链接库
-static:强制使用静态链接库
-L libpath -static -lmylib:链接libmylib.a
-L libpath -lmylib:链接libmylib.so
gcc下程序链接静态库:主文件必须在静态库前面!gcc -0 test test.c -lmylib
-pipe:提高编译速度
-Dmacro:定义宏macro
gdb
gdb <program>
gdb <program> core
gdb <program> PID //attach
gdb 环境中执行linux的shell命名
shell <command args>
make <make-args> // = shell make <make-args>
run > output //重定向输出
breakpoint, watchpoint, catchpoint
watch,rwatch,awatch
catch <event>:event发生时停止程序,event={throw, catch, exec, fork, vfork, load, unload}
handle <signal> <keywords...>
info threads
b linespec thread <threadno> (if ...)
bt
frame <n>:切换当前栈
up/down <n>
info frame/frame:查看当前栈信息
info locals:当前函数的局部变量值
-g编译过后的执行程序中包含了源文件的名字,没有路径名
dir <dirname...>:添加一个源文件路径到当前路径的前面,多个路径用:隔开
show directories:显示当前定义了的源文件搜索路径
源代码的内存地址
info line {<line>/<func>/<file:line>/<file:func>}
disassemble:查看源程序的汇编代码
p/{x/t/d/u/o/a/c/f}@len
examine <addr>:查看内存
info registers:查看寄存器
调试多进程
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)状态。
GDB多线程调试的基本命令
info threads 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break [LOCATION] [thread THREADNUM] [if CONDITION] 在[LOCATION]处为[thread THREADNUM]设置断点在满足条件[if CONDITION]时停住 。
调试宏:在GCC编译程序的时候,加上-ggdb3参数,就可以了
info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
macro – 你可以查看宏展开的样子。
x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
x/x 以十六进制输出
x/d 以十进制输出
x/c 以单字符输出
一些辅助的诊断及调试工具:
1)strace:跟踪系统调用情况
2)ltrace:跟踪动态库的调用情况
3)mtrace,pmalloc:跟踪内存使用情况,需要嵌入代码,打印内存使用记录。
4)Binuitls:Toolchain的工具,参考我的上一篇总结。
5)Valgrind:非常好的内存泄露检测工具,限于i386
6)oprofile, NPTL Trace Tool等
7)ald:汇编语言调试器
8)Dude:另一个运行linux上的调试器,未使用ptrace实现
9)Linice(http://www.linice.com/)是SoftIce在Linux中的模拟软件,用于调试没有源代码的二进制文件的内核级调试器。
make
联系客服