GCC编译选项与GDB调试学习总结

系统运维 waitig 491℃ 百度已收录 0评论

GCC编译选项与GDB调试学习总结

GCC编译选项

  • GCC选项

    GCC编译相关的选项如下:

    • –help:显示gcc帮助说明
    • -target-help:显示目标机器特定的命令行选项
    • –version:显示gcc版本号和版权信息
    • -E:只进行预处理,不编译
    • -S:只编译,不汇编
    • -c:只编译、汇编,不链接
    • -pipe:使用管道代替临时文件
    • -combine:将多个原文件一次性传递给汇编器
    • -g:包含调试信息
    • -I:指定include包含文件的搜索目录
    • -o:输出成指定文件名
    • -v:详细输出编译过程中所采用的每一个选项
    • -ggdb:在可执行文件中包含GDB调试使用的信息
    • -fverbose-asm:在编译成汇编语言时,把C变量的名称作为汇编语言中的注释
    • -save-temps:自动输出预编译处理文件、汇编文件、对象文件,编译正常进行
    • -fsyntax-only:只测试源文件语法是否正确,不会进行任何编译操作
    • -ffreestanding:编译成独立程序,而非宿主程序
    • -ansi:ANSI标准
    • -std=c99:C99标准
    • -std=gnu89:ISO/IEC 9899:1990以及GNU扩充
    • -std=gnu99:ISO/IEC 9899:1999以及GNU扩充
    • -trigraphs:支持ISO C三字符组
    • -w:忽略所有警告
    • -Werror:不区分警告和错误,遇到任何警告都停止编译
    • -Wall:开启大部分警告提示
    • -Wshadow:某语句块作用域变量与更大作用域的另一变量同名时发出警告(次警告未包含在-Wall选项中,需单独开启)
    • -Wextra:对所有合法但值得怀疑的表达式发出警告
    • -O0:关闭所有优化选项
    • -O1:第一级别优化,使用此选项可使可执行文件更小,运行更快,并不会增加太多编译时间,可以简写为-O
    • -O2:第二级别优化,采用了几乎所有优化技术,使用此选项会延长编译时间
    • -O3:第三级别优化,在-O2的基础上增加了产生inline函数、使用寄存器等优化技术
    • -O5:此选项类似于-O2,作用是优化所占用的空间,但不会进行性能优化,常用于生成最终版本
    • -x:使用此选项可以指定自定义的源文件扩展名,类型有c,c-header,cpp-output,assembler,assembler-with-cpp,none。凡是-x后面所列的所有文件都会被视为其指定的类型,要想改变类型可以再一次使用-x选项,或者使用-x none回到默认设置
    • -l library:进行连接时搜索名为library的库
    • -L dir:把dir加入到搜索库文件的路径列表中
    • -Dname:预定义一个名为name的宏,值为1
    • -Dname=definition:预定义名为name,值为definition的宏
    • -M:告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中#include引用的所有文件。生成的规则可以是单行,但如果太长,就用’/’换行符连续成多行。规则显示在标准输出,不产生预处理过的C程序
    • -C:告诉预处理器不要丢弃注释。配合-E选项使用
    • -P:告诉预处理器不要产生#inline命令。配合-E选项使用
    • -static:在支持动态链接的系统上,阻止链接共享库。
    • -nostdlib:不链接系统标准启动文件和标准库文件,只把指定的文件传递给链接器
    • -W:打印一些额外的警告信息
    • -w:禁止显示所有警告信息
    • -msse/-msse2/mmx/mno-sse/mno-sse2/mno-mmx:使用或者不使用MMX、SSE、SSE2指令
    • -m32/-m64:生成32位/64位机器上的代码
    • -mpush-args/mon-push-args:(不)使用push指令来进行存储参数,默认是使用。
    • -mregparm=num:当传递整数参数时,控制所使用寄存器的个数。

    备注:指定了-L dir和-l库名参数,但通过ldd命令查看时,找不到指定链接的.so文件,此时需要通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录,通过此做法可解决库无法链接的问题。

  • 创建并使用静态链接库方法

    • 编写C源文件,设为static_lib.c,其中写入需要重复调用的函数,然后使用命令gcc -c static_lib.c生成目标文件static_lib.o
    • 使用ar工具创建静态库,命令格式:ar rcs static_lib.a static_lib.o
    • 编写C头文件static_lib.h,其中写入这些函数的原型声明
    • 编写主函数app.c,引入头文件static_lib.h,这样就可以正常使用那些自定义的可复用函数
    • 使用命令gcc app.c -static ./static_lib.a -o app编译生成可执行文件app
  • 创建并使用动态库方法

    • 编写C源文件share_lib.c,写入需要重复调用的函数,然后使用命令gcc -shared -FPIC -o share_lib.so share_lib.c生成动态库文件share_lib.so
    • 编写C头文件share_lib.h,写入函数的原型声明
    • 编写主函数app.c,引入头文件share_lib.h,然后就可以调用在动态库中自定义的函数
    • 使用命令gcc app.c ./share_lib.so -o app编译生成可执行文件app。

GDB调试学习

  • 简介

    GDB是GCC的调试工具。其功能如下:

    • 启动程序,使程序按自定义形式运行;
    • 使程序停止指定断点位置;
    • 程序停止后,检查程序执行中的相应情况;
    • 动态改变程序执行环境。
  • gdb调试

    能进行GDB调试,一般在编译过程中,需使用-g参数。如果不使用-g参数,则在gdb调试过程中,将不能得到程序的函数名、变量名等信息,而只能看见运行时内存地址。举例如下:

    • gcc test.c -o test -g
    • g++ test.cpp -o test -g

    启动gdb调试的方法有以下三种:

    • gdb filename // 其中filename为可执行文件名
    • gdb filename core // core是程序core dump产生的文件,产生core文件,需设置栈大小无线使用ulimit -c unlimited
    • gdb filename PID // PID一般是服务程序运行时的进程ID

    常用的调试有以下几种:

    • r:运行被调试的程序。如果之前没有设过断点,则执行完整个程序;如果设过断点,则程序停在第一个断点处。
    • c:继续执行被调试程序,直到到下一个断点,或程序整体结束。
    • b:设置断点,包括以下几种:
      • b <行号> // 停在程序的指定一行
      • b <函数名称> // 停在程序的某个函数处
      • b *<函数名称> // 停在编译器生成的prolog代码处。主要用于汇编调试
      • b *<代码地址> // 停在代码的某个地址处
      • d <编号> // 删除断点
      • info b // 查看断点
    • s:执行一行源程序的代码,如果此行代码中存在函数调用,则进入该函数。
    • n:执行一行源程序的代码,此代码中的函数调用执行完成。
    • si:类似于s命令,不同的是,si针对的是汇编指令,而s针对的是源代码。
    • ni:类似于n命令,不同的是,ni针对的也是汇编指令,而n针对的是源代码。
    • p/print:打印指定变量(临时变量和全局变量)、字符串、表达式等值。
    • display …:设置程序中断后想显示的数据及其格式。如希望程序中断后显示即将被执行的下一条汇编指令,可使用如下命令:display /i pcpc指当前汇编指令,/i指十六进制显示。
    • undisplay <编号>:取消先前的display设置,编号从1开始递增。
    • i/info:显示各类信息。
    • q:退出gdb调试环境。
    • help [命令名称]:gdb帮助命令,提供对GDB各种命令的解释说明。如果指定了“命令名称”参数,则显示该命令的详细说明;若果没有指定参数,则分类显示所有GDB命令,共用户进一步浏览和查询。
    • cd dir:运行GDB,使用dir作为gdb的工作目录。
    • se File:从File读取符号表并把它作为可执行文件。
    • -write:开通enable往可执行文件和核心文件写的权限。
    • clear:删除一个断点,这个命令需指定代行或者函数名。
    • set:设置变量的值。如set val = 2即为把2保存到val变量中;设置输入参数使用set args a b c(a,b,c分别为对应输入参数)。
    • watch:监视一个变量的值,不管它何时被改变。
    • rwatch:指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个命令调试。
    • Ctrl + c:在当前位置停止执行正在执行的程序,断点在当前行。
    • ptype:显示变量的类型
    • return:强制从当前函数返回。
    • whatis:显示变量的值和类型。
    • xbreak:在当前函数的退出的点上设置一个断点。
    • load:动态加载一个可执行文件到调试器。
    • ignore:忽略某个断点指定的次数。
    • finish:继续执行,直到当前函数返回。
    • disable:禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数。
    • bt:显示程序堆栈信息。
    • l:l相当于list,从第一行开始列出源码。
  • 参考文献

    http://blog.csdn.net/lee244868149/article/details/38754153

    http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2288004.html

    http://www.cnblogs.com/hdk1993/p/4631222.html


本文由【waitig】发表在等英博客
本文固定链接:GCC编译选项与GDB调试学习总结
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)