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中