linux下实现简易shell

Posted wangyubjhd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下实现简易shell相关的知识,希望对你有一定的参考价值。

GDB是GNU项目调试器,支持C、C++、Go、Fortran、Object-C、Assembly等。能够暂停程序运行,调试程序(包括本地调试、远程调试),如何远程调试我将在之后的文章中写道,本篇只讨论基本用法。

首先准备gdb调试环境:-g参数

$ gcc -g *.c
$ ls
a.out a.out.dSYM

-g参数让编译器在生成可执行文件a.out时加入调试信息(在a.out.dSYM目录下)

启动gdb

$ gdb a.out
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
...
(gdb)

现在我们进入了gdb的调试界面

熟悉几个基本命令:

  • l 列出附近10行代
  • b [n] 设置断点在第几行(也可写函数名)
  • r 开始调试
  • n 执行下一行
  • c 执行到下一断点
  • q 退出gdb
  • p [argv] 打印参数
  • s 进入函数
  • watch [v] 观察变量变化

下面有一段程序

main.c

 1 #include <stdio.h>
 2 #include "func.h"
 3 
 4 int main()
 5 {
 6     char str[] = "This is a test."; // line 6
 7     int len = myStrlen(str);
 8     printf("len:%d
", len);
 9 
10     return 0;
11 }

func.c

 1 int myStrlen(const char *str)
 2 {
 3     int len = 0;
 4     const char *p = str;
 5     while (*p != ) {
 6         ++len;
 7         ++p;
 8     }
 9     return len;
10 }

 

在main.c第6行设置断点(想在main.c中给func.c设置断点输入b func.c:3

(gdb) b 6
Breakpoint 1 at 0x100000f11: file main.c, line 6.

开始调试,程序自动暂停在第6行(此行即将执行,str尚未赋值)

(gdb) r
Starting program: /Users/mgrwang/Dev/test/a.out

Breakpoint 1, main () at main.c:6
6    char str[] = "This is a test.";
(gdb) p str
$1 = 00 <repeats 15 times>

向下执行,程序运行到第7行

(gdb) n    
7    int len = myStrlen(str);
(gdb) p str
$3 = "This is a test."

输入s进入函数体myStrlen,如果想继续执行不查看函数,输入n执行下一行

(gdb) s
myStrlen (str=0x7fff5fbff980 "This is a test.") at func.c:3
3    int len = 0;

查看程序执行位置附近代码

(gdb) l
1    int myStrlen(const char *str)
2    {
3      int len = 0;
4      const char *p = str;
5      while (*p != ) {
6        ++len;
7        ++p;
8      }
9      return len;
10   }

(省略部分执行细节)

观察变量p值变化

(gdb) watch *p
Hardware watchpoint 3: *p

Old value = 84 T
New value = 104 h

退出调试

(gdb) watch *p
Hardware watchpoint 3: *p

Old value = 84 T
New value = 104 h

 


以上是关于linux下实现简易shell的主要内容,如果未能解决你的问题,请参考以下文章

手动实现一个简易linux中shell

手动实现一个简易linux中shell

手动实现一个简易linux中shell

手动实现一个简易linux中shell

Linux实现简易的Shell命令行解释器

Shell外壳的简易模拟