gdb命令

掌握 Linux 调试技术

心不动则不痛 提交于 2020-04-07 20:48:30
摘自: https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/ 摘自 https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/#artrelatedtopics 本文讨论了四种调试 Linux 程序的情况。在第 1 种情况中,我们使用了两个有内存分配问题的样本程序,使用 MEMWATCH 和 Yet Another Malloc Debugger(YAMD)工具来调试它们。在第 2 种情况中,我们使用了 Linux 中的 strace 实用程序,它能够跟踪系统调用和信号,从而找出程序发生错误的地方。在第 3 种情况中,我们使用 Linux 内核的 Oops 功能来解决程序的段错误,并向您展示如何设置内核源代码级调试器(kernel source level debugger,kgdb),以使用 GNU 调试器(GNU debugger,gdb)来解决相同的问题;kgdb 程序是使用串行连接的 Linux 内核远程 gdb。在第 4 种情况中,我们使用 Linux 上提供的魔术键控顺序(magic key sequence)来显示引发挂起问题的组件的信息。 常见调试方法 当您的程序中包含错误时,很可能在代码中某处有一个条件,您认为它为真(true),但实际上是假

Linux Core Dump

南楼画角 提交于 2020-04-04 01:06:04
转载 1. 前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件->行, 而是没有任何信息, 使得我们的调试变得困难起来. 2. gdb: 有一种办法是, 我们用gdb的step, 一步一步寻找. 这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员. 我们还有更好的办法, 这就是core file. 3. ulimit: 如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置: #设置core大小为无限 ulimit -c unlimited #设置文件大小为无限 ulimit unlimited 这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限. 4. 用gdb查看core文件: 下面我们可以在发生运行时信号引起的错误时发生core dump了. 发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行. gdb [exec file] [core file] 如: gdb ./test test.core 在进入gdb后,

段错误调试神器 - Core Dump详解

喜欢而已 提交于 2020-04-04 00:57:37
一、前言 : 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得困难起来. gdb: 有一种办法是, 我们用gdb的step, 一步一步寻找. 这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员. 我们还有更好的办法, 这就是core file. ulimit: 如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置: #设置core大小为无限 ulimit -c unlimited #设置文件大小为无限 ulimit unlimited 这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限. 用gdb查看core文件: 下面我们可以在发生运行时信号引起的错误时发生core dump了. 发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行. gdb [exec file] [core file] 如: gdb ./test test.core 在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里,

GDB 学习

六月ゝ 毕业季﹏ 提交于 2020-03-25 18:26:41
通常使用gdb在Linux下调试C/C++程序,编译的时候加上-g选项(gcc -g ......)。下面总结的是我自己经常使用(当然也有一些用的比较少)的gdb命令。 (1) 开始及退出 开始: gdb program 退出: quit (简写 q )或者Ctrl+d (2) 自动补全 : Tab (3) 启动程序 : run (简写 r ):运行程序直到遇到断点 与 srart 的区别:start会在程序的入口函数(通常是main)设置一个临时断点,然后调用run。 (4) 断点 (breakpoint):简写b 设置断点: break 函数名:在指定函数入口处设置断点 break 函数名[or 行号 or 地址] if 条件(就是一个布尔表达式,但是不需要加括号) break 行号:在指定行设置断点 break 地址 break filename 行号[or 函数名] break ,无参的话会在下一条指令处设置断点。 删除断点: ( 断点号可由info break获得) delete 断点号。(也可以删除断点的集合:delete 2-5) disable 断点号:暂停使用该断点 enable 断点号:重新启用该断点 clear 行号 or 函数名 :删除指定地点的所有断点(比如clear fun,则删除fun函数中所有的断点) delete breakpoints

作业3:构造一个简单的Linux系统MenuOS 20135115臧文君

余生长醉 提交于 2020-03-15 12:02:25
构造一个简单的Linux系统MenuOS 注:作者:臧文君,原创作品转载请注明出处,《 Linux 内核分析》 MOOC 课程 http://mooc.study.163.com/course/USTC-1000029000 一、Linux内核源代码介绍 1、根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码。 init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点)。 ipc:进程间通信 kernel:Linux内核的核心代码 关注readme文件 二、构造一个简单的Linux系统MenuOS <步骤指导> 1、在实验楼环境下: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 即可启动内核,完成后进入 menu 程序,支持三个命令help、version和quit。 2、使用自己的Linux系统环境搭建MenuOS的过程 # 下载内核源代码编译内核 cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz xz -d

使用strip, eu-strip, objcopy等剥离与导回符号表及调试信息

若如初见. 提交于 2020-01-30 01:47:17
1.符号表信息和调试信息 符号表信息(symbols)和调试信息(debug info)是由不同段区分的。 使用 readelf -S binfile 可以查看ELF文件的所有段。 调试信息相关的段: # readelf -S a.out | grep debug [27] .debug_aranges PROGBITS 0000000000000000 000016d0 [28] .debug_info PROGBITS 0000000000000000 00001700 [29] .debug_abbrev PROGBITS 0000000000000000 00001a0f [30] .debug_line PROGBITS 0000000000000000 00001adb [31] .debug_str PROGBITS 0000000000000000 00001bd2 符号表相关的段: # readelf -S a.out | grep tab [32] .symtab SYMTAB 0000000000000000 00001e18 [33] .strtab STRTAB 0000000000000000 00002670 [34] .shstrtab STRTAB 0000000000000000 00002a8f 注: 下文中提及的符号表相关段将不包括

GCC编译选项

老子叫甜甜 提交于 2020-01-25 08:19:36
转载自http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html gcc 提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常可以使用 -Wall 来开启以下警告: -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration -Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above) -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused

noilinux下的emacs极简教程

我们两清 提交于 2020-01-18 00:26:47
前言 这篇文章的目的并不是为了教会你使用emacs,而是让你在noilinux下能有一个好用且功能不逊于devc++的代码编辑器 如果想学emacs可以左转另一篇文章 emacs学习笔记 这篇文章只针对noilinux下的gui版本的emacs 以下内容均在noilinux下测试 打开emacs 从左上角的"应用程序->编程"打开emacs(实际上noilinux默认打开文档的软件就是emacs) 设置 因为这篇文章很入门,所以尽量在gui中进行所有设置 虽然我写了这么长,实际上是可以光速完成的(因为他们的位置是连续的) 一 选择"Options" 勾上"HighLight Matching Parentheses"(高亮匹配括号) 勾上"Use CUA keys"(使用Ctrl+C复制,Ctrl+X剪切,Ctrl+V粘贴) 点"Save Options"(保存更改) 二 "Options->Costumize Emacs->Custom Themes" 选一个自己喜欢的主题然后点上面的保存 三 "Options->Costumize Emacs->All Settings Matching" 这个是搜索设置的界面,因为emacs的设置太多了所以菜单放不下 输入"linum" 把"Global Linum Mode"打开(行号) 输入"pair" 把"Electric Pair

gdb调试

亡梦爱人 提交于 2020-01-09 01:06:05
编译时加入 -gdwarf -2 -g3 -O0 可以查看宏定义macro expand *** Ctrl + C 命令中断下来后 c继续 break break functionname,在函数名为 functionname 的入口处添加一个断点;//b main break LineNo,在当前文件行号为 LineNo 处添加一个断点;// b 452 break filename:LineNo,在 filename 文件行号为 LineNo 处添加一个断点。//b anet.c:441 bt:查看堆栈 f *:切换堆栈 info break:查看断点 //info b disable *//禁用某个断点 enable * //启动某个断点 如果没有加上*时,则是禁用或启动全部的断点 delete 编号 为删除某个断点 list : 查看当前断点处的代码 l + l - 回车:重复 打印 p *:查看值 P &*:查看值地址 p *=*:给值 ptype *:查看数据结构 info args:查看当前函数参数的值 线程 查看线程 info thread 切换线程 thread 2 查看当前函数的参数值:info args 控制流命令 next: n跳到下一步不会进入函数体. step: s遇到函数进入函数内部 return:在当前位置返回. finish:执行函数到ghip退出

gdb与Cmake的使用

帅比萌擦擦* 提交于 2019-12-29 16:19:46
文章目录 编写程序以及CMakeList.txt文件 编译 调试 使用gdb运行程序 查看代码 查看主文件代码 查看指定函数代码 设置断点 查看所有断点 断点操作 删除断点 禁用断点 启用断点 运行 开始执行并在main第一行停下来 打印内部变量 手动修改变量值 跟踪查看变量值 继续运行直到下一个断点 查看堆栈 执行下一行(不进入函数) 执行下一行(会进入函数) 终止正在调试的任务 退出调试环境 编写程序以及CMakeList.txt文件 代码可在下方链接查看 https://github.com/heyanwei/OpenCVLearning 在此处,只是说明CMakeList.txt中要定义的内容 cmake_minimum_required(VERSION 2.8) project(DEMO) SET(CMAKE_BUILD_TYPE "Debug") # 定义编译类型 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") # 定义Debug编译参数 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") # 定义Release编译参数 find_package(OpenCV REQUIRED) aux_source_directory(.