C专家编程 第6章 运行的诗章:运行时数据结构 6.11 有用的C语言工具

发布于:2022-08-05 ⋅ 阅读:(295) ⋅ 点赞:(0)

有用的C语言工具 
                                   用于检查源代码的工具 
工具                    位于何处                            所作工作
cb                    随编译器附带                  C程序美化器,在源文件中运行这个过滤器,可以使源文                                                                 件具有标准的布局和缩进格式。来自Berkeley
indent                                                     与cb作用相同。来自AT&T
cdecl                 本书                              分析C语言的声明
cflow                 随编译器附带                打印程序中调用者/被调用者的关系
cscope              随编译器附带                一个基于ASCII码C程序的交互式浏览器。我们在操作系统                                                                小组中使用,用于检查头文件修改的结果。它提供了对下                                                                  列问题的快速答案:“有多少命令使用了libthread”或阅读了                                                                kmem的所有文件是那些”
ctags                 /usr/bin                         创建一个标签文件,供vi编译器使用。标签文件能加快程                                                                  序源文件的检查速度,方法使维护一个表,里面有绝大多                                                                  数对象的位置
lint                  随编译器附带                  C程序检查器
sccs                  /usr/ccs/bin                   源代码版本控制系统
vgrind                /usr/bin                         格式器,用于打印漂亮的C列表


                                   用于检查可执行文件的工具
工具                    位于何处                           所做工作
dis                   /usr/ccs/bin                   目标代码反汇编工具
dump-Lv          /usr/ccs/bin                   打印动态链接信息
ldd                   /usr/bin                          打印文件所需的动态
nm                   /usr/ccs/bin                   打印目标文件的符号表
strings             /usr/bin                          查看嵌入于二进制文件中的字符串。用于查看二进制文件                                                                 可能产生的错误信息,内置文件名和(有时候)符号名或                                                                 版本和版权信息
sum                 /usr/bin                          打印文件的检验和与程序块计数。回答下面这样的问题:                                                                  “这些可执行文件是同一版本的吗?”“传输是否成功”
                                    帮助调式的工具
工具                    位于何处                           所做工作 
truss                 /usr/bin                       trace的SVr4版本,这个工具打印可执行文件所进行的系统                                                                调用。它可用于查看 二进制文件正在干什么,以及为什么                                                                阻塞或者失败。这将非常有用
ps                    /usr/bin                        显示进程的特征
ctrace              随编译器附带              修改你的源文件,使文件执行时按行打印。是一个对小程序                                                             非常有用的工具
debugger        随编译器附带              交互式调试器
file                  /usr/bin                        告诉你的文件包含的内容(如可执行文件、数据、ASCII、                                                               Shell脚本、archive等)

                                     性能优化辅助工具
工具                   位于何处                             所做工作
collector           随编译器附带                 (SunOS独有)在调试器控制下收集运行时性能数据
analyzer           随编译器附带                 (SunOS独有)分析已收集的性能数据
gprof                 /usr/ccs/bin                      显示调用图配置数据(确定计算密集的函数)
prof                   /usr/ccs/bin                      显示每个程序所耗时间的百分比
tcov                  随编译器附带                   显示每条语句执行次数的计数(用于确定一个函数中计                                                                     算密集的循环)
time                  /usr/bin/time                     显示程序所使用的实际时间和CPU时间

如果你工作于操作系统的内核模式,则无法使用绝大多数运行时工具,因为内核不像用户进程那样运行。可以使用编译时工具如lint,但除此之外我们只能使用石刀和燧斧了:将有序模式放入内存中,看看它们何时被覆盖(最常使用的两个是十六进制常量deadbeef和abadcafe),以及使用printf或类似的函数并记录跟踪信息。

用grep调试内核
当内核检测到“不会出现”的情况时,他就会“惊慌失措”,引起突然停止。
我们队伍中的两个顶尖工程师着手处理这个问题,他们注意到一个内存块的前19字节总是被涂抹。
这是一个不寻常的变异量,不像别处出现的2、4、8等常见值。其中一个工程师灵机一动。使用
这个偏移量来寻找这个bug。他建议用内核调试器kadb来反汇编内核二进制文件的映像(花了一小时时间),并将结果输出到一个ASCII文件中。然后用grep对这个文件进行搜索,寻找操作数偏移量为19的store指令。一共有8条这样的指令,它们都位于处理进程控制的子系统中。他们终于找到了罪魁祸首:位于一个进程控制结构中的竞争条件。它的用意是一个线程在其他线程(调用了该线程)真正完成工作之前现在内存中做个标记,以便以后返回系统。结果内核分配器把这块内存分配给了别人,但进程控制块仍以为它还保留有这块内存,所以向其写入,这样就导致了这个极难被发现的Bug。 
 


网站公告

今日签到

点亮在社区的每一天
去签到