使用GDB调试汇编程序(简单)
直接调试目标程序的第一条命令,假如程序文件名是test01:
1 | gdb ./test01 |
这样就进入了gdb程序。
第二步,先run一下:
命令很简单,就是run:
1 | run |
或者也可以简写成r:
1 | r |
如果不运行run直接打断点调试的话,会遇到下面的错误:
1 | Warning: |
原因在于数据断点的设置有误。在没有用gdb运行(run)过可执行程序之前,使用disasemble指令反汇编出来的汇编语言的左边的地址偏移地址,不是逻辑地址。所以,即使break指令能够设置断点,当GDB运行时也不可能访问到这个地址。也就会出现上面的错误。
数据断点:给某个内存地址设置断点,改变该地址所装内容时会触发断点,运行到该地址时会触发断点。(从网上看的,参考)
而学过操作系统或者微机原理就该知道,程序给出来的只是逻辑地址,不可能直接给物理地址的,物理地址都是由系统将其映射成了逻辑地址。
将格式改为intel格式:
1 | set disassembly-flavor intel |
反汇编main函数:
1 | disas main |
开始打断点调试:
比如输入disas main
命令后看到了以下的内容:
1 | (gdb) disas main |
如果我要把断点打在<+5>的位置上,就输入以下命令:
1 | break *0x56556195 |
程序将在运行完<+0>,还未运行<+5>的时候停下来。
该命令还可以简写成这样:
1 | b *0x56556195 |
然后输入
1 | run |
开始调试
查看寄存器的值
比如查看eax的值:
1 | info register eax |
单步步进:
运行下面命令:
1 | stepi |
此时输入disas
可以看到运行的位置:
1 | (gdb) disas |
继续运行:
运行下面命令:
1 | continue |
Linux中shell的特殊变量
shell中的特殊变量:
变量名:含义$0
:shell或shell脚本的名字
$*
:以一对双引号给出参数列表
$@
:将各个参数分别加双引号返回
$#
:参数的个数
$_
:代表上一个命令的最后一个参数
$$
:代表所在命令的PID
$!
:代表最后执行的后台命令的PID
$?
:代表上一个命令执行后的退出状态
echo $?
:如果返回值是0,就是执行成功;如果是返回值是0以外的值,就是失败。
Ubuntu创建目录快捷方式
ln -s [绝对路径] ~/桌面/[快捷方式文件名]
如:
1 | ln -s /mnt/hgfs/vmshared ~/桌面/shared |
解决Nodejs http模块返回内容中文乱码问题
只需要一行代码:
1 | res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); |
完整的代码示例:
1 | var http = require('http'); |