可执行文件生成,依赖项检测,gdb调试命令

一、编译,生成执行文件,预处理 -> 编译(译为汇编代码) -> 汇编 -> 链接 -> 可执行文件
  • gcc,g++
    • gcc -g hello.c -o hello
    • g++ -g hello.cpp -o hello
    • gcc main.c -o gdb-sample -g // 生成调试文件使用
            // -o 参数指定了编译生成的可执行文件名为 gdb-sample,使用参数 -g 表示将源代码信息编译到可执行文件中
            gdb // 开始执行gdb命令
            file gdb-sample // 打开生成的gdb文件
  • make,需先手动/自动生成Makefile文件,make内置gcc,g++
    • makefile:cmake -DCMAKE_DEBUG_TYPE=debug  -->  make,调试版本与发布版本
    • 根据Makefile内容可生成是否具有调试信息的可执行文件
 
二、查看文件依赖项
  • ldd
    • ldd program(可执行文件) 查看当前可执行文件运行库支持
    • ldd /bin/ls 查看当前链接的库地址
  • pmap
    • objdump -p /usr/local/php/bin/php |grep NEEDED
    • pmap pid |head 查看当前进程pid,使用哪些运行库 
 
三、gdb/cgdb调试:
  • 启动 >> gdb与cgdb的区别是后者分页能看到当前代码页,便于使用者阅读:
    • 未有pid,cgdb/gdb program
    • 已有pid,cgdb/gdb program pid ,改pid为需要调试程序,如果program为服务程序,就可以将pid程序用gdb来调试,也可分两步执行,先启动program,然后在命令输入pid
    • r(run),启动
    • cgdb program core,core为当前program程序运行异常崩溃,直接启动可以显示崩溃信息(堆栈内容,PS:有时需要设置系统命令“ulimit -c unlimited”才能产生core文件)
    • cgdb窗口切换,按esc键可让输入焦点进入到vi窗口,再按i键回到gdb窗口。按其它键也可以进入到vi窗口,比如小键盘上的按键(如果此时Num Lock处于打开状态)
  • start >> 开始执行程序,停止在main函数开始处
  • 打印
    • 普通类型变量:p var (p /x var 十六进制显示)
      • x 按十六进制格式显示变量
      • d 按十进制格式显示变量
      • u 按十六进制格式显示无符号整型
      • o 按八进制格式显示变量
      • t 按二进制格式显示变量
      • a 按十六进制格式显示变量
      • c 按字符格式显示变量
      • f 按浮点数格式显示变量
    • 指针*val: p *var;boost::shared_ptr<T> val,p ((*T)var)->name(or function),p val->px->name(or function)
    • 非指针类型地址val: p &var
    • 数组a:p *a@10显示 数组a内的10个元素
    • call function,执行function方法,直接显示返回值,如果返回为void,不显示
    • p function,与call类似,返回值为void也就显示
  • info
    • info files 查看当前调试文件信息
    • info break 查看断点信息
    • info frame 查看当前方法语言
    • info local 显示当前函数局部变量信息
    • info var 显示所有全局及静态表里名称
    • info func 显示所有函数名称
    • info prog 显示被调试程序执行状态
    • info signals 显示gdb支持哪些信号
  • 线程、堆栈
    • bt,查看堆栈
      • f number 查看当前number代码
      • up 上移一栈,使得当前为执行函数
      • down 下移一栈
    • info threads 查看当前所有线程,其中前面加“*”线程为当前运行线程
    • thread id 切换当前调试线程位制定id的线程,适用于多线程环境
    • thread apply id1 id2 command 线程id1 id2执行command命令
    • thread apply all command 所有线程执行command命令
    • where 查看程序出错地方
    • 多线程 set scheduler-locking off|on|step,使用多线程调试会发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,可设置此参数来防止其它线程执行
      • off不锁定任何线程,也就是所有线程都执行,这是默认值
      • on只有当前被调试程序会执行
      • step在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行
  • 查看文件
    • list n1 n2 显示当期啊弄文件n1行到n2行之间的代码
    • list file:number 显示file文件number行附近代码 
    • list file:function function函数代码
  • 其它
    • jump number 强制跳转到 number 行执行
    • n 执行下一行
    • s 单步执行,进入函数内部
    • enter 执行上一步操作
    • return 返回当前调用
    • until 执行当前循环下一行
    • until file:number 执行到当前number行
    • finish 执行完成当前调用方法
    • kill 终止当前调试进程
    • file app 载入app可执行程序,调试
  • show 
    • show language 查看当前语言
    • show args 显示缺省参数列表
    • whatis var 显示变量var类型
    • ptype var 显示变量类型,如果var是结构体会显示全部内容
  • set
    • set args no修改启动参数,参数args[1]为no,也可启动r + 参数,如 r no 
    • set language c++ 手动设置当前程序语言为c++
    • set language 查看可设置语言
    • set variable i=1 设置成员变量值
  • 断点
    • info break 显示断点
    • b file:number 下断点
    • b file:number if(condition) 下断点,满足condition时,停止
    • b file:number thread id if(condition) id为线程id
    • del break num 删除num行断点
    • disable break num 禁用断点
    • enable break num 启用断点
    • enable once break num 启用一次后禁用
    • clear 删除刚才停止处断点
    • clear file:number 清除number行所有断点
    • watch i>100 监视,当i满足这个条件是,停止
  • 信号signal,gdb可接受外部信号来处理当前程序状态
  • 多进程
    set follow-fork-mode child
    set detach-on-fork off
posted @ 2017-02-27 16:53  零下¥六度  阅读(431)  评论(0编辑  收藏  举报