《软件调试的艺术》笔记--使用其他调试工具

1.splint

splint是一个开源的静态代码检查工具,使用方法如下:

待检测的程序程序如下:

#include <stdio.h>

static void display(int i)
{
	printf("i = %d\n",i);
}

int main(void)
{
	int i,j;
	i = 1;
	i = i + 1;
	display(i);
	return 0;
}

调试如下:

$ splint main.c

Splint 3.1.2 --- 03 May 2009

main.c: (in function main)

main.c:10:8: Variable j declared but not used

A variable is declared but never used. Use /*@[email protected]*/ in front of

declaration to suppress message. (Use -varuse to inhibit warning)

Finished checking --- 1 code warning

提示定义了一个变量j但是从来没有使用过。

将j定义去掉后,再进行检测:

$ splint main.c

Splint 3.1.2 --- 03 May 2009

Finished checking --- no warnings

splint有一大推flag可以使用,使用时标志前加’+‘或’-’,‘+‘标志开启这个标志,‘-‘表示关闭此标志。

下列语句用于检查程序中数据的越界问题。

splint +bounds main.c

2.strace

strace常用来跟踪进程执行时的系统调用和所接收的信号。

对上面的程序进行追踪测试:

$ strace ./a.out

execve("./a.out", ["./a.out"], [/* 50 vars */]) = 0

brk(0)                                  = 0x1033000

access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)

mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64fa550000

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)

open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

fstat(3, {st_mode=S_IFREG|0644, st_size=77020, ...}) = 0

mmap(NULL, 77020, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f64fa53d000

close(3)                                = 0

access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)

open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3

read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\30\2\0\0\0\0\0"..., 832) = 832

fstat(3, {st_mode=S_IFREG|0755, st_size=1815224, ...}) = 0

mmap(NULL, 3929304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f64f9f70000

mprotect(0x7f64fa125000, 2097152, PROT_NONE) = 0

mmap(0x7f64fa325000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7f64fa325000

mmap(0x7f64fa32b000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f64fa32b000

close(3)                                = 0

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64fa53c000

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64fa53b000

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64fa53a000

arch_prctl(ARCH_SET_FS, 0x7f64fa53b700) = 0

mprotect(0x7f64fa325000, 16384, PROT_READ) = 0

mprotect(0x600000, 4096, PROT_READ)     = 0

mprotect(0x7f64fa552000, 4096, PROT_READ) = 0

munmap(0x7f64fa53d000, 77020)           = 0

fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f64fa54f000

write(1, "i = 2\n", 6i = 2

)                  = 6

exit_group(0)                           = ?

3.ltrace

ltrace用来跟踪进程调用库函数的情况。

对上面的程序进行追踪测试:

$ ltrace ./a.out

__libc_start_main(0x400518, 1, 0x7ffff364a1a8, 0x400550, 0x4005e0 <unfinished ...>

printf("i = %d\n", 2i = 2

)                                                                   = 6

+++ exited (status 0) +++

《软件调试的艺术》笔记--使用其他调试工具

时间: 2024-10-16 17:57:51

《软件调试的艺术》笔记--使用其他调试工具的相关文章

《软件调试的艺术》学习笔记——GDB使用技巧摘要

<软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. 作者是美国的Norman Matloff和Peter Jay Salzman,中文版由张云翻译.是人邮出版社图灵程序设计丛书初版.这里称为"艺术",个人觉得有点过了,但是其中关于gdb以及在gdb基础之上集成的DDD和Eclipse调试技巧的整理确实是做的很好,对于Linux/开源社区下的

《软件调试的艺术》笔记--停下来环顾程序

1.断点列表 创建的每个断点(包括断电.监视点和捕获点)都标识为从1开始的唯一整数标识符.这个标识符用来执行该断点上的各种 操作.调试器还包含一种列出所有断点及其属性的方法. 调试下面的代码:(代码1) #include <stdio.h> void display(int i) { i = i + 1; printf("i = %d\n",i); } int main(void) { int i = 1; display(i); return 0; } 设置断点--显示断

《软件调试的艺术》笔记--预备知识

1.gcc的-g选项 如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码信息编译到可执行文件中. 如果不使用-g选项: #include <stdio.h> int main(void) { int i = 1; i = i + 1; printf("i = %d\n",i); return 0; } gcc main.c gdb a.out (gdb) b main Breakpoint 1 at 0x4004f8 (gdb) r

《软件调试的艺术》笔记--调试多线程程序

下面是于线程相关的GDB命令用法汇总: info threads:给出关于当前所有线程的信息. thread 3:改成线程3. break 88 thread 3 :当线程到达源代码88时停止执行. break 88 thread 3 if i == 2 当线程3到达源代码行88行,并且变量i的值为2时停止执行. 对下面的多线程进行调试: #include <stdio.h> #include <pthread.h> #include <string.h> #inclu

《软件调试的艺术》笔记--检查和设置变量

1.使用print命令查看变量值 使用print命令(简写为p)可以查看变量值. 使用如下的程序1进行测试. #include <stdio.h> struct node{ int index; struct node* next; }; int main(void) { struct node head; head.index = 1; head.next = NULL; int i; for(i=0; i<3; i++){ head.index++; } return 0; } (g

《软件调试的艺术The Art of Debugging with GDB,DDD,and Eclipse》

#第1章 **使用TUI模式的GDB**指定-tui或者CTRL+X+A #第2章 停下来环顾程序# **断点**通知GDB暂停程序的执行 **监视点**通知GDB当特定内存位置(或者涉及一个或多个位置的表达式)的值发生变化时暂停执行. **捕获点**通知GDB当特定事件发生时暂停执行. ###2.4.1在GDB中设置断点### ●break *function* ●break *line_number* ●break *filename:function* ●break *filename:l

《软件调试》读书笔记:第13章 硬错误和蓝屏

会话管理器进程SMSS.exe是系统启动后的第一个用户态进程,负责启动和监护windows子系统进程:CSRSS.exe和登陆管理进程:WinLogon SMSS.exe从注册表中查询子系统exe文件的位置,并且启动它 CSRSS是windows子系统进程,自NT4以后窗口管理和GDI的主体实现被移出了CSRSS放到了win32k.sys中. CSRSS监管着所有windows线程和进程,每个进程在创建后都要到这里登记才能运行,退出时也要报告注销. CSRSS具有桌面管理.终端登录.控制台管理.

《软件调试艺术》读后感一

1.预备知识 在进入正题之前要对GDB有一个大概的了解,GDB能干什么?GDB现在的实用性还有多少?等问题,我们带着这样的问题去书中探索,这样会使我们学到更多的东西. 首先,我看一张图,这张图不是我画的,但是这张图基本涵盖了<软件调试艺术>这本书的所有内容.也就是这本书的浓缩版,精华版. 这本书主要以GDB调试软件为基础进行讲解,可能在此之前我们大家对调试并不关注,或者都没有觉得调试有多重要.我们总是写代码,这些代码的工程比较小,代码量少,所以调试工具没有太大的帮助.如果我们的程序非常的大,并

&lt;读书笔记&gt;软件调试之道 :从大局看调试-零容忍策略

声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! -------------------------------------------------------------------------------------------- 缺陷优先 如何使缺陷修复与软件开发相结合? 如何估计缺陷修复花费的时间? 如何确保项目不会陷入<人月神话>中所描述的无数缺陷修复的焦油坑中呢? 缺陷优先 要采用早起缺陷修复原则,并且基于以下两