解决core核心文件转出问题

ulimit -c #查看core文件的生成开关,若为0则关闭

ulimit -c unlimited #打开开关,只在当前shell生效

sudo sh -c 'echo "./%e.core.%p" > /proc/sys/kernel/core_pattern' #在当前目录下生成core文件,临时生效

启动GDB

gdb ./process         #直接调试目标程序
gdb ./process core  #调试转储文件
gdb <program> <PID>  #调试服务程序

开始调试

栈回溯显示我们是如何到达失败点的,通常足够帮助我们确定常见的问题。

bt (backtrace的简写)常常是我在 gdb 中使用的第一条命令

gdb$ bt     #栈回溯,有core文件的情况下
disas main #反汇编main函数,或者其它出错函数
i r     #(info registers 的简写)打印寄存器值
start    #开始调试,在main函数的第一条语句停下来 ; 等同于 break main

查看源代码

  • list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
  • list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
  • list 函数名:将显示“函数名”所在函数的源代码,如:list main
  • list :不带参数,将接着上一次 list 命令的,输出下边的内容

设置断点

break 是设置断点,可简写为b

b n  #在第n行源码处设置断点

b fn1 if a>b   #条件断点设置

b func  #在func()函数入口点设置断点

delete 断点号n  #删除第n个断点

disable 断点号n  #暂停第n个断点

enable 断点号n  #开启第n个断点

clear 行号n  #清除第n行的断点

info b   #(info breakpoints)显示当前程序的断点设置情况

delete breakpoints  #清除所有断点

交互命令

r  #运行此程序
c  #继续运行
next  #单步步过
step  #单步步入
until  #一直运行程序,直到退出循环体
until+行号  #运行至某行,不仅仅用来跳出循环
finish  #运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
call 函数(参数)  #调用程序中可见的函数,并传递“参数”,如:call gdb_test()
q  #退出

打印表达式

print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式

比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用

print a    #将显示整数 a 的值
print name  #将显示字符串 name 的值
p main    #打印main函数内容和地址
p buffer    #打印buffer内容
p &buffer    #打印buffer地址
info f  #这句也可以查到main函数地址,最后一行
  • display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
  • watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
  • whatis :查询变量或函数
  • info function: 查询函数
  • 扩展info locals: 显示当前堆栈页的所有变量

回退

gdb 有一个超棒的功能叫回退

这里我可以逐行或逐条指令的回退。它通过播放我们记录的寄存器状态来工作

reverse-stepi    #回退一条指令

用GDB查看内存

格式: x /nfu <addr>

x 是 examine 的缩写

n 表示要显示的内存单元的个数

f 表示显示方式, 可取如下值

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u 表示一个地址单元的长度

b 表示单字节
h 表示双字节
w 表示四字节
g 表示八字节

Format letters are

o(octal), x(hex), d(decimal), u(unsigneddecimal)
t(binary), f(float), a(address), i(instruction), c(char) ands(string)

Size letters are

b(byte), h(halfword), w(word), g(giant, 8bytes)

举例

x/3uh buf
表示从内存地址buf读取内容
h 表示以双字节为一个单位
表示三个单位
u 表示按十六进制显示

详细例子:

(gdb) list
#include<stdio.h>
int main()
{
  char a[];
  a[]='a';
  unsigned long long md5=;
  printf("%d/n",a[]);
  return ; } (gdb) break Breakpoint at 0x8048372: file test.c, line . (gdb) run Starting program:/data/compiler/g_platform/bradenwu/md5/test.out Breakpoint , main () at test.c: return ; (gdb) x/8xb md5 0x8837f465: Cannot access memory at address 0x8837f465 (gdb) x/8xb &md5 0xbfffefa0: 0x65 0xf4 0x37 0x88 0x2e 0x4f 0x0b 0xc4

GDB 调试工具高级用法的更多相关文章

  1. gdb调试高级用法

    Linux下进程崩溃时定位源代码位置 如何在调试内核时,同时可以调试应用程序的做法: (cskygdb) c Continuing. ^C Program received signal SIGINT ...

  2. GDB调试工具入门

    从windows转到linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到windows上调试.于是,花了一点时间来搜索一下linux下常见的调试工具,这不搜不知道, ...

  3. Git log高级用法

    格式化Log输出 首先,这篇文章会展示几种git log格式化输出的例子.大多数例子只是通过标记向git log请求或多或少的信息. 如果你不喜欢默认的git log格式,你可以用git config ...

  4. chrome调试工具高级不完整使用指南(基础篇)

    一.前言 本文记录的是作者在工作上面对chrome的一些使用和情况的分析分享,内容仅代表个人的观点.转发请注明出处(http://www.cnblogs.com/st-leslie/),谢谢合作 二. ...

  5. chrome调试工具高级不完整使用指南(优化篇)

    上一篇文章我们说了chrome调试工具的一些比较基础功能的用法,接下来我们要在这一篇文章中说一说,其他一些chrome调试工具的使用方法 2.1.5 Network模块 在netWork模块中,大致上 ...

  6. chrome调试工具高级不完整使用指南(实战二)

    3.3 给页面添加测试脚本 在现实的工作中,我们往往会遇到一些问题在线上就会触发然后本地就触发不了的问题.或者是,要给某个元素写一个测试脚本.这个时候如果是浏览器有提供一个添加脚本的功能的话,那么我们 ...

  7. git log 高级用法

    转自:https://github.com/geeeeeeeeek/git-recipes/wiki/5.3-Git-log%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95 内 ...

  8. 【Linux】GDB调试工具

    GDB调试工具 Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序. 一. GDB的主要功能有: 设置断点,当程序运行到断点处暂停 显示变量的值,可以打 ...

  9. Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试

    转载自 https://my.oschina.net/leejun2005/blog/399108 1.Fiddler Script 1.1 Fiddler Script简介 在web前端开发的过程中 ...

随机推荐

  1. UVA 11982 Fantasy Cricket

    https://vjudge.net/problem/UVA-11982 题意: 给出一个包含’U’, ‘D’, ‘E’的字符串, ’U’ 表示需要把这个字符向后移动, ’D’表示需要把这个字符向前移 ...

  2. UVA 10479 The Hendrie Sequence

    https://vjudge.net/problem/UVA-10479 打表找规律: 1.根据n可以确定第n项在上表中第i行 2.减去前i-1行,就得到了n在第i行的第j个 3.第i行的规律:1个i ...

  3. 树的性质和dfs的性质 Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) E

    http://codeforces.com/contest/782/problem/E 题目大意: 有n个节点,m条边,k个人,k个人中每个人都可以从任意起点开始走(2*n)/k步,且这个步数是向上取 ...

  4. linux 中 permission denied的问题

    想在linux中运行一个脚步,却提示permission denied. 文件权限不允许. 为了获得执行权限,借助chmod指令修改文件权限即可. 1.如果是运行程序时出现此提示,一般执行chmod ...

  5. css单位em、px、rem和pt的区别

    1.PX :像素(Pixel) PX是相对长度单位,它是相对于显示器屏幕分辨率而言的. 优缺点:比较稳定和精确,但在浏览器中放大或缩放浏览页面时会出现页面混乱的情况. 2.EM:是相对长度单位. EM ...

  6. 【BZOJ】1087: [SCOI2005]互不侵犯King

    [算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...

  7. Spring Cloud全家桶主要组件及简要介绍

    一.微服务简介 微服务是最近的一两年的时间里是很火的一个概念.感觉不学习一下都快跟不上时代的步伐了,下边做一下简单的总结和介绍. 何为微服务?简而言之,微服务架构风格这种开发方法,是以开发一组小型服务 ...

  8. 在Unity中实现屏幕空间反射Screen Space Reflection(1)

    本篇文章我会介绍一下我自己在Unity中实现的SSR效果 出发点是理解SSR效果的原理,因此最终效果不是非常完美的(代码都是够用就行),但是从学习的角度来说足以学习到SSR中的核心算法. 如果对核心算 ...

  9. 16 - 文件操作-StringIO-BytesIO

    目录 1 文件操作 1.1 open函数介绍 1.2 打开操作 1.2.1 mode模式 1.2.2 文件指针 1.2.3 缓冲区 1.2.4 encoding编码 1.2.5 其他参数 1.3 读写 ...

  10. xargs -i 和-I 的区别【转】

    xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如  # find . -type f -name "*.log" | xargs rm -rf * ...