GDB学习与shell脚本

gdb命令包含在gcc开发套件中,视功能强大的程序调试器。可以跟踪被调试的程序(二进制文件),进行断点设置(b),单步操作(n/s)等。当程序暂停执行时,可以通过命令查看程序中的变量值(p)、CPU的寄存器值(i r)、内存(i locals)的值,及函数调用栈(bt)等信息。

格式:gdb(选项)(参数)

gdb file <文件名> 加载gcc编译输出的可执行文件

gdb r 执行被调试文件 (run)

gdb b<行数/函数名> 设置断点 (breakpoint)

gdb d 删除所有断点

#断点根据函数执行顺序起作用,而不是行号

gdb s 执行下一行源代码(可进入被调函数) (step)

si汇编代码

gdb p <变量名> 查看变量的值 (print)

gdb c 继续执行被调试程序 (continue)

gdb q 退出GDB调试环境 (quit)

gdb b 函数名 在函数的prolog代码处设置断点

# prolog、epilog分别是编译器在每个函数的开头和结尾自行插入的代码

gdb n 执行下一行源代码(不进入被调函数) (next)

ni汇编代码

gdb l 列出源码,一次列出十行 (list)行

gdb l 数字 从第数字行列出上面五行,下面五行

gdb ret 从当前函数返回 (return)

#函数遇到return就结束

gdb i b 查看所有断点 (info)

GDB使用步骤:

先使用命令gdb -g xxx.c -o xxx 将源代码信息编入到可执行文件中

#命令顺序无所谓,但-o xxx必须在一起

# 并不是嵌入,如果源代码改名或移到别处,(gdb) l 将列不出源代码

gdb 进入GDB调试环境

参数 执行想要的操作

调试带命令行参数文件的方法:

#初识命令行参数 int main(int argc,char *argv[])

在GDB环境下:run + 参数

在外部:gdb --args 文件名 + 参数

小贴士:

在提示符下直接敲回车表示重复上一个命令(单步跟踪常用)

可以使用上下键切换历史命令

可以使用Tab键自动补全,命令较复杂时,敲两次Tab键可以列出所有选项

shell脚本语言是命令解析器,将用户的输入的指令转化为机器可以运行的程序。

#!/bin/bash #!/bin/sh bash 与 sh 语法有些许区别

脚本语言不需要编译 自带编译器bash

shell脚本固定格式:

#!/bin/sh #!告诉系统这是shell程序,后面必须加绝对路径

#comments #注释

Your commands go here #命令

文件"后缀"sh表明是一个Bash脚本文件

chmod +x 文件名.sh 将脚本文件的属性改为可执行

./文件名.sh 执行脚本

# shell 与开机启动有关

# &&什么什么连在一起执行

# .sh不是后缀 在Linux中无后缀说法

# 加这些的目的 1.便于自己识别 2.有的编译器只识别特定的后缀

最简单的脚本hello world

./bin/sh

#print hello world in the console window (控制台窗口)

a = "hello world"

echo $a #echo输出命令

${变量} 或$变量 表示引用变量

Makefile中$()

变量:有字符串组成,不需要声明 定义变量等于号前不能加空格

当变量名与其他文字混淆将无法识别变量

默认变量:

$#:传入脚本的命令行参数个数

$*:所有命令行的参数值,在各个参数值之间留有空格

$0:命令本身(shell文件名)

$1:第一个命令行参数

$2:第二个命令行参数

$?:程序的返回值判断 0成功 (默认的) 非0 不成功

echo命令

echo (内容) 将内容输出到桌面

echo (内容) > (文件名#若没有,会自己创建)

> 重定义 有覆盖作用

>> 可以追加 不覆盖

脚本for循环 (循环circulation)

1.

for ((i=0;i<5;i++));

do

echo "helloworld"

done

2.

for i in {1..10}

do

echo "hello"

done

3.

for i in a b c d

do

echo $i

done

重复使用命令时可用到脚本

#!/bin/bash

for name in $1 $2 $3

do

mkdir $name

cd /home/lianxi/shell/$name

echo > ./$name.c"

#include<stdio.h>

int main()

{

printf(\"helloworld\\n\");

return 0;

}"

cd .. #在Linux中符号不能嵌套,要使用转义字符

done

脚本if语句

判断文件或目录

#!/bin/bash

PATH=$1

if [ ! -n $PATH];then #-n 判断参数是否为空

echo "输入有误"

exit 1

fi

if [ -d $PATH ];then #-d 判断目录

echo "是个目录"

fi

if [ -f $PATH ];then #-f 判断文件

echo "是个文件"

fi

if [ -d $PATH ];then

echo "是个目录"

elif [ -f $PATH ];then

echo "是个文件"

fi

case 语句

判断字符

#!/bin/bash

echo "请输入一个字符:"

read Key

case $Key

case "$Key" in :

[A - Z] ) : echo "大写字母";;

[a - z] ) : echo "小写字母";;

[0 - 9] ) : echo "数字";;

[A - Z] ) : echo "其他";;

esca

如果大小写字母有问题

设置 export LANG=C

export 环境变量 unset 取消

在不同终端中环境变量不同步

命令就是把二进制文件放入PATH中

猜你喜欢

转载自blog.csdn.net/zzb_mx/article/details/81137406
今日推荐