C语言 使用gcc、gdb

gcc命令

 

预处理阶段
$ gcc -E hello.c -o hello.i

编译阶段
$ gcc -S hello.i -o hello.s

汇编阶段
$ gcc -c hello.s -o hello.o

链接阶段
$ gcc hello.o -o hello

-g
生成调试信息,GNU调试器可以利用该信息。gcc编译器使用该选项进行编译时,将调试信息加入目标文件当中,这样GDB调试器就可以根据这些调试信息来跟踪程序的执行状态

编译多个头文件和源文件

方法一:分步处理

由c1.c生成目标文件c1.o
$ gcc -c c1.c -o c1.o

由c2.c生成目标文件c2.o
$ gcc -c c2.c -o c2.o

由两个目标文件生成程序
$ gcc c1.o c2.o -o m1

方法二:同时处理

直接使用源代码来编译
$ gcc c1.c c2.c -o m2

GDB调试

语法$ gdb [参数] filename

  • -symbols = file

    • -s file:读出文件(file)的所有符号
  • -core

    • -c :这里的core是程序非法执行后的core dump后产生的文件
  • -directory

    • -d:加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径
  • quiet

    • q:使用该参数不显示gdb的介绍和版权信息等
  • gdb命令

    1. file:指定要调试的可执行程序
    • kill:终止正在调试的可执行程序
    • next:执行一行源代码,但不进入函数内部
    • list:部分列出源代码
    • step:执行一行源代码,并不进入函数内部
    • quit:结束gdb调试任务
    • watch:可以检查一个变量的值,而不管他何时被改变
    • print:打印表达式的值到标准输出
    • break N:在指定的第N行源代码设置断点
    • break funcname
    • break filename:linenum
    • break filename:funcname
    • info break:显示当前的断点清单,包括到达断点处的次数等
    • info files:显示被调试的详细信息
    • info func:显示所有的函数名
    • info local:显示当函数中的局部变量的信息
    • info prog:显示被调试程序的执行状态
    • info var:显示所有的全局和静态变量的名称
    • make:在不退出gdb的情况下运行make工具
    • shell:在不退出gdb的情况下运行shell命令
    • continue:继续执行正在调试的程序
    • 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 pc,其中pc,其中pc指当前汇编指令,/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,从第一行开始列出源码。

猜你喜欢

转载自blog.csdn.net/fzf1996/article/details/90610047