【摘要】在linux下,我们也应该掌握常见的程序调试指令,这样才能方便我们在linux下进行工作。在Windows下虽然调试程序比较方便,但是linux有比它更加吸引人的地方在于它可以很轻松的就进入一个程序的内部。这对于我们后期的代码分析有很大的好处,所以,今天我就把这几天学到的关于调试程序的命令行总计一下,希望会对你们有所帮助。
(1)【strip +程序中的代码段】 给文件瘦身
这个命令行通常是用来加密你的代码的。如果你的代码不想要被别人分析,你就可以这样做。当然,这是在汇编代码做的修改,它会隐藏函数调用的开头,让人没办法分清楚函数调用的顺序从而达到保护代码隐私的目的。
(2) 【gcc test.c -o main -m32】
这个命令行是一个组合的命令,它要执行的命令是,在编译阶段,当编译器生成可执行文件时改名为 main ,对了 后面的 -m32意思是生成的文件是32位系统下的
(3) 【objdump -dS main】(反汇编)
将可执行文件以反汇编文件的形式展开
(4)【o1 o2 o3】 程序优化等级,o3是最高等级优化(优化之后很多东西可以省略掉,汇编代码会缩减很多)
(5)
volatile (阻止编译优化)
(6)对警告的处理
-w (不生成任何警告信息)
-Wall(显示所有警告)
linux -gdb使用(gdb的安装我在上一篇博客里已经说过了)
1.【valgrind】 ---检测程序有没有内存泄漏(Windows底下没有)(这个linux不是自带的,需要单独安装)
2.【top】 观察内存使用情况
3.【shift加>向下翻屏,加<向上翻屏】
调试时一定要加上 -g 选项
gdb a.out(调试程序)
1.l(list )num(行号) l func 直接找到对应的函数
2.设置断点 b 19 ,在19行设置一个断点
【b func】 (在函数的第一行代码那里设置断点)
3. i b(查看断点)
4.r. 继续运行(到断点那里停下来)
5.n(next)一直给下走,不会进入函数
6.s 下一步,会进入函数
7.print i (看 i 的值)
8.what is i 查看类型
9. d(delete) 写断点编号而不是行号 1
设置条件断点b 19 if i==19
10. finish 执行当前函数的返回
11. bt 打印出函数调用栈(重要)在程序出错时使用
(core dumped)段错误 ,调试core程序
第一步:gcc -g
第一步:ulimit -c unlimited (大小不受限制)
第三步:./a.out
第四步:gdb a.out core.xxx(告诉你在哪一行出错