睿虎的博客

预备知识:

你可以执行下列命令来创建一篇新文章或者新的页面。

1
hexo new [layout] <title>

比如:

1
hexo new page MyPage

这样可以创建一个路径为MyPage的页面。

再比如:

1
hexo new doc MyPost

这样可以使用doc作为模板创建一个路径为MyPost的文章。

建立文章草稿

1
hexo new draft <title>

当然也可以写作:

1
hexo n draft <title>

将草稿发布为正式文章

1
hexo P <filename>

本机预览草稿

1
hexo S --draft

本机预览

1
hexo S

直接调试目标程序的第一条命令,假如程序文件名是test01:

1
gdb ./test01

这样就进入了gdb程序。

第二步,先run一下:

命令很简单,就是run:

1
run

或者也可以简写成r:

1
r

如果不运行run直接打断点调试的话,会遇到下面的错误:

1
2
3
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x1190

原因在于数据断点的设置有误。在没有用gdb运行(run)过可执行程序之前,使用disasemble指令反汇编出来的汇编语言的左边的地址偏移地址,不是逻辑地址。所以,即使break指令能够设置断点,当GDB运行时也不可能访问到这个地址。也就会出现上面的错误。
数据断点:给某个内存地址设置断点,改变该地址所装内容时会触发断点,运行到该地址时会触发断点。(从网上看的,参考)
而学过操作系统或者微机原理就该知道,程序给出来的只是逻辑地址,不可能直接给物理地址的,物理地址都是由系统将其映射成了逻辑地址。

将格式改为intel格式:

1
set disassembly-flavor intel

反汇编main函数:

1
disas main

开始打断点调试:

比如输入disas main命令后看到了以下的内容:

1
2
3
4
5
6
7
8
9
(gdb) disas main
Dump of assembler code for function main:
0x56556190 <+0>: mov eax,ds:0x4008
0x56556195 <+5>: mov ebx,0x9b
0x5655619a <+10>: sub ebx,0xa
0x5655619d <+13>: add eax,ebx
0x5655619f <+15>: ret
End of assembler dump.

如果我要把断点打在<+5>的位置上,就输入以下命令:

1
break *0x56556195

程序将在运行完<+0>,还未运行<+5>的时候停下来。

该命令还可以简写成这样:

1
b *0x56556195

然后输入

1
run

开始调试

查看寄存器的值

比如查看eax的值:

1
info register eax

单步步进:

运行下面命令:

1
stepi

此时输入disas可以看到运行的位置:

1
2
3
4
5
6
7
8
(gdb) disas
Dump of assembler code for function main:
0x56556190 <+0>: mov eax,ds:0x56559008
=> 0x56556195 <+5>: mov ebx,0x9b
0x5655619a <+10>: sub ebx,0xa
0x5655619d <+13>: add eax,ebx
0x5655619f <+15>: ret
End of assembler dump.

继续运行:

运行下面命令:

1
continue

shell中的特殊变量:
变量名:含义
$0:shell或shell脚本的名字

$*:以一对双引号给出参数列表

$@:将各个参数分别加双引号返回

$#:参数的个数

$_:代表上一个命令的最后一个参数

$$:代表所在命令的PID

$!:代表最后执行的后台命令的PID

$?:代表上一个命令执行后的退出状态

echo $? :如果返回值是0,就是执行成功;如果是返回值是0以外的值,就是失败。

只需要一行代码:

1
res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});

完整的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var http = require('http');
var url = require('url');
var util = require('util');

http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
// 解析 url 参数
var params = url.parse(req.url, true).query;
res.write("网站名:" + params.name);
res.write("\n");
res.write("网站 URL:" + params.url);
res.end();

}).listen(8888);

0%