gdb命令

使用gdb进行调试中级篇

我与影子孤独终老i 提交于 2019-12-25 06:41:35
  闲话少叙,经过 上篇文章 的铺垫后,咱们趁热打铁,继续学习。    设置断点   break <function> 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。    break <linenum> 在指定行号停住。    break filename:linenum 在源文件filename的linenum行处停住    break filename:function 在源文件filename的function函数的入口处停住    break *address 在程序运行的内存地址处停住    break if i=100 表示当i为100时停住程序    info breakpoints( info break ) 查看断点    设置观察点(WatchPoint)   观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:    watch <expr> 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序    rwatch <expr> 当表达式(变量)expr被读时,停住程序    awatch <expr> 当表达式(变量)的值被读或被写时,停住程序    info watchpoints

Linux_x86_Pwn溢出漏洞

做~自己de王妃 提交于 2019-12-17 06:48:06
基础栈溢出:未开启任何保护的程序 漏洞程序源码 #include <stdio.h>#include <stdlib.h>#include <unistd.h>​void vulnerable_function() { char buf[128]; read(STDIN_FILENO, buf, 256);}​int main(int argc, char** argv) { vulnerable_function(); write(STDOUT_FILENO, "Hello, World\n", 13);} 编译: gcc -fno-stack-protector -z execstack -o vuln vuln.c -g-fno-stack-protector #关闭PIE(堆栈保护)-z execstack #关闭NX(DEP) 堆栈保护相关参数 gcc -fno-stack-protector //禁用堆栈保护gcc -fstack-protector //启用堆栈保护,针对有字符串数组的函数gcc -fstack-protector-all //启用堆栈保护,针对所有函数gcc -fstack- protector-strong //更强版本 关闭系统ASLR su rootecho 0 > /proc/sys/kernel/randomize_va_spaceexit

gdb常用命令

匿名 (未验证) 提交于 2019-12-03 00:11:01
参考链接:Linux C编程基础 娄嘉鹏 命令 作用 list(l) 列出代码清单 display 设置自动显示的变量 printf(p) 显示指定变量的值 run(r) 运行 continue(c) 继续执行 breakpoint(b) 1.函数断点:进入指定函数时停住 b main 2.行断点:在指定行号停住 b 8 3.条件断点 b if i=100 4.临时断点 tb dis disable断点号 enable 启用断点 Step(s) step into Next(n) 单步 until 是一个循环结束 finish 使一个函数结束 info(i) 显示各类信息 i r Quit(q) 退出 来源:博客园 作者: Sy1j 链接:https://www.cnblogs.com/20175211lyz/p/11567615.html

c/c++总结

浪尽此生 提交于 2019-12-02 10:47:13
1. 0X0 0x0地址是NULL 2. Gdb调试子进程 1.set follow-fork-mode <parent/child> 这条命令可以用于在调试父进程或是子进程的模式之间进行切换。例如在 fork 函数执行之前执行 set follow-fork-mode child, 当 fork 执行后,设定在子进程上的断点将会有效,而父进程上的断点此时无效;反之依然。缺省 gdb 是调试主进程的。 2.attach<pid> GDB 有附着( attach )到正在运行的进程的功能,即 attach <pid> 命令。因此我们可以利用该命令 attach 到子进程然后进行调试。 3. Gdb调试nginx 多进程调试 #sudo gdb –q (gdb)shell ./nginx 如果只是gdb ./nginx 那么启动nginx还是单进程 4. Linux内核模块编写和makeFile编写 hello.c内容: #include <linux/module.h> #include <linux/init.h> static int hello_init(void) { printk( KERN_ALERT " hello world enter \n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT

report for PA1

纵然是瞬间 提交于 2019-11-30 15:52:46
说明: % report for PA1 1.ISA=x86 2.关于x86 register 存在的问题,修改前reg.h文件寄存器设置中32,16,8位寄存器空间采用struct分配, 不共用空间,按照x86要求,改为使用Anonymous Union分配,然而发现修改后发现仍然报assertion fail, 检查reg.c 中test的code后,发现assert函数通过检验之后在同一个struct中声明的一系列rtlreg(eax,ecx,etc.)是否与对应寄存器位置相同, 所以要求这一系列rtlreg与gpr之间也采用Anonymous Union分配。 %% PA1.1 fun1.si ​ 利用sscanf(source_str,format,&des)按格式读入参数,注意des参数要用地址表示; ​ 之后根据参数调用相应函数(cpu_exec)即可 ​ 完成之后添加了判断N==0,提示无效(阅读代码框架可知N=-1表示最大uint,有效) fun2.info r ​ 在相应的isa中写好isa相关的isa_reg_display,后调用即可,写的时候利用阅读代码可知直接利用相应的写好的宏定义等(reg_name.reg_b,reg_l,reg_w)即可快速实现 ​ 好看起见,查阅了printf函数中打印16进制相关参数, “%#x” //表示按格式输出, “%nx

#转载备忘# Linux程序调试工具

空扰寡人 提交于 2019-11-30 02:55:08
Ref: https://linuxtools-rst.readthedocs.io/zh_CN/latest/advance/02_program_debug.html 2. 程序调试 目录 程序调试 进程调试 gdb 程序交互调试 pstack 跟踪栈空间 strace 分析系统调用 目标文件分析 nm objdump readelf size 查看程序内存占用 file 文件类型查询 strings 查询数据中的文本信息 fuser 显示文件使用者 xxd 十六进制显示数据 od 2.1. 进程调试 gdb 程序交互调试 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c++程序员,gdb是必不可少的工具; GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。 以下从一个完整的调试过程简单说明最基本的几个命令; $gdb programmer # 启动gdb >break main # 设置断点 >run # 运行调试程序 >next # 单步调试 >print var1 # 在调试过程中,我们需要查看当前某个变量值的时候,使用print 命令打印该值 >list # 显示当前调试处的源代码 >info b # 显示当前断点设置情况

gdb常用命令

假如想象 提交于 2019-11-28 08:05:18
命令 命令缩写 命令说明 list l 显示多行源代码 break b 设置断点,程序运行到断点的位置会停下来 info i 描述程序的状态 run r 开始运行程序 display disp 跟踪查看某个变量,每次停下来都显示它的值 step s 执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 next n 执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) print p 打印内部变量值 continue c 继续程序的运行,直到遇到下一个断点 set var name=v 设置变量的值 start st 开始执行程序,在main函数的第一条语句前面停下来 file 装入需要调试的程序 kill k 终止正在调试的程序 watch 监视变量值的变化 backtrace bt 查看函数调用信息(堆栈) frame f 查看栈帧 f n 切换到编号为n的栈 quit q 退出GDB环境 来源: https://www.cnblogs.com/under/p/11401029.html

Linux 下GDB的使用之简单入门

穿精又带淫゛_ 提交于 2019-11-27 04:52:21
Linux 下程序崩溃。先要生成Core文件方可调试(这里 Test为被调试程序 ) 1.查看Core文件(相当于Windows下的dump)大小,如果为0,则不会生成core文件 ulimit -c 查看core文件大小 ulimit -c filesize 设置大小为 filesize ulimit -c unlimited 设置core大小为无限制 2.启动被调试程序 进入到被调试程序目录,输入gdb ./Test 回车 如果被调试程序有参数需设置,则 set args xxxx 回车 也可 r arg1 arg2 3.设置(删除,使能,失能)断点 如果是C++程序,则 b ClassName::Fun 即给类名为 ClassName的成员函数Fun下断点 也可 b xxx.cpp:LineNum 即给xxx.cpp的LineNum 行下断点 下好断点后,可查看断点 info b 或者 info break 删除断点 delete number(断点编号) 或者delete all enable b number (使能断点) disable b number (失能断点) 4.运行程序 r 5.单步运行(步过,不进入函数内部) n 6.单步步入(步入,进入函数内部) s 7.运行到下个断点 c (contune) 8. 查看变量 p var(变量名)或者p addr

GDB调试及coredump详解

情到浓时终转凉″ 提交于 2019-11-26 03:09:48
一、coredump:是针对程序异常而产生的core文件,包含程序运行时的内存、寄存器状态、堆栈指针、函数调用等信息,用于存储程序出错时的状态。 二、coredump的存储位置:与被执行文件在同一目录下。当然,位置可以在程序中通过 chdir 命令修改 三、如何判断是coredump文件:该文件主要的格式为 ELF 格式。可以通过 readelf -h core 进行判断,如图: 四、产生coredump的条件: 首先确认 当前会话 中的ulimit -c,若为0,则不会产生core,需要修改和设置。 附: ulimit -c unlimited #可以产生core且不受大小限制 ulimit -a #显示当前各种用户进程设置 #ulimit的某些参数设置与运行机器的配置有关,慎重使用。 ulimit -d unlimited #数据段长度 ulimit -m unlimited #最大内存大小 ulimit -s unlimited #堆栈大小 #以上是设置为无限制 #若是想设置对应字符大小,可以指定如下图: ulimit -c [size] 可能 -c 设置成 4 也不会生成core,因人而异。 当前用户对写入core目录的写权限有足够的空间。 其他不会产生core文件的原因。 五、coredump产生的几种情况 内存访问越界 多线程程序使用不安全的线程函数