码迷,mamicode.com
首页 > 系统相关 > 详细

linux下实现简易shell

时间:2019-01-17 12:06:32      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:obj   执行文件   repeat   object-c   c++   user   部分   函数名   一段   

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\n", 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 != \0) {
 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 = \000 <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 != \0) {
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

标签:obj   执行文件   repeat   object-c   c++   user   部分   函数名   一段   

原文地址:https://www.cnblogs.com/wangyubjhd/p/10281417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!