CoreDump调试指南:4、CoreDump实验

目录

🍅点击这里查看所有博文

  随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有一点用处的技巧,用的不多的技巧可能一个星期就忘了。

  想了很久想通过一些手段把这些事情记录下来。也尝试过在书上记笔记,这也只是一时的,书不在手边的时候那些笔记就和没记一样,不是很方便。

  很多时候我们遇到了问题,一般情况下都是选择在搜索引擎检索相关内容,这样来的也更快一点,除非真的找不到才会去选择翻书。后来就想到了写博客,博客作为自己的一个笔记平台倒是挺合适的。随时可以查阅,不用随身携带。

  同时由于写博客是对外的,既然是对外的就不能随便写,任何人都可以看到。经验对于我来说那就只是经验而已,公布出来说不一定我的一些经验可以帮助到其他的人。遇到和我相同问题时可以少走一些弯路。

  既然决定了要写博客,那就只能认真去写。不管写的好不好,尽力就行。千里之行始于足下,一步一个脚印,慢慢来 ,写的多了慢慢也会变好的。权当是记录自己的成长的一个过程,等到以后再往回看时,就会发现自己以前原来这么菜😂。

  本系列博客所述资料均来自互联网,并不是本人原创(只有博客是自己写的)。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。

实验代码

  编写测试代码,这里需要故意写出错误代码,测试CoreDump是否正常工作。

  示例代码中因为pStr指向字符串常量,字符串常量是保存在常量区的,调用free释放常量区的内存肯定会导致段错误。

ubuntu@kvm:~/CoreDump$ vim ./TestCoreDump.c
#include "stdio.h"
#include "stdlib.h"
void dumpCrash()
{
    char *pStr = "test coredump";
    free(pStr);
}

int main()
{
    dumpCrash();
    return 0;
}

编译

  解析core文件需要符号表等debug信息。而且为了更好找到代码位置,最好不要让编译器自动优化。

添加调试信息

  这边以GCC编译器作为举例,GCC常用的编译选项如下所示。

root@kvm:~/CoreDump# gcc --help
-E:仅作预处理,不进行编译、汇编和链接
-S:仅编译到汇编语言,不进行汇编和链接
-c:只编译、汇编,不链接
-g/-ggdb:生成调试信息
-I:指定include包含文件的搜索目录
-o:输出成指定文件名
-w:不生成任何警告
-Wall:生成所有的警告
......

  本次示例中可以使用下列示例命令完成可执行文件的编译。

root@kvm:~/CoreDump# gcc -ggdb3 -O0 TestCoreDump.c -o TestCoreDump

  命令中添加-g或者-ggdb的编译选项。-g产生的debug信息是OS native format,GDB可以使用。而-ggdb产生的debug信息更倾向于给GDB使用。

  如果用的GDB调试器,那么使用-ggdb选项。如果是其他调试器,则使用-g。在-ggdb选项后的数字指定了调试信息的级别。在这种情况下,-ggdb33表示生成最详细的调试信息。数字表示调试信息的级别,其中:

  • ggdb0: 不包含调试信息。
  • ggdb1: 生成基本的调试信息。
  • ggdb2: 生成比基本更多的调试信息。
  • ggdb3: 生成最详细的调试信息。

禁止编译优化

  有些编译器编译会存在一个默认的优化等级,经过优化的代码会与原始代码存在一定的差异。随着优化等级越高,差异越大。这会使得我们的调试变得异常困难。

  所以我们在编译是需要使用-O0编译参数将编译过程设置为不进行任何优化。

优化级别说明备注
-O0关闭所有优化代码空间大,运行效率低
-O1基本优化等级编译器在不花费太多编译时间基础上,试图生成更快、更小的代码
-O2O1的升级版编译器试图提高代码性能,而不会增大体积和占用太多编译时间
-O3最危险的等级会延长代码编译时间,生成更大体积、更耗内存的二进制文件,大大增加编译失败的几率和不可预知的程序行为,得不偿失
-OgO1的基础上去掉了影响调试的优化如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠-g参数的
-OsO2的基础上进一步优化代码尺寸去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。
-Ofast优化到破坏标准合规性的点在O3的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。

禁止去除符号

  有一些编译脚本会在编译完成后使用strip工具去除目标文件中的一些符号表、调试符号表信息,以减小静态库、动态库和程序的大小。strip后的elf文件不方便调试。我们需要在编译目录中找到中原始的可执行文件。

  这里通过file命令可以查看可执行文件的信息,只有提示not stripped字样的可执行文件才具备调试的功能。

root@kvm:~/CoreDump# file ./TestCoreDump
./TestCoreDump: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=6a269357cb09285ddd34db494ab1dadb366ee8a5, not stripped

  这里演示一下strip工具的用法,可以看到经过strip工具处理后的可执行文件,file命令查询的结果是stripped。

root@kvm:~/CoreDump# strip TestCoreDump -o TestCoreDump-strip
root@kvm:~/CoreDump# file ./TestCoreDump-strip 
./TestCoreDump-strip: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=6a269357cb09285ddd34db494ab1dadb366ee8a5, stripped

运行

  执行编译的程序会触发程序崩溃,程序的运行结果中出现了core dumped(核心已转储)字眼,说明core文件已经生成。

root@kvm:~/CoreDump# ./TestCoreDump
*** Error in `./TestCoreDump': munmap_chunk(): invalid pointer: 0x00000000004005e4 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777f5)[0x7f6a84d217f5]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x1a8)[0x7f6a84d2e6e8]
./TestCoreDump[0x400542]
./TestCoreDump[0x400553]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f6a84cca840]
./TestCoreDump[0x400459]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fc:01 265244                             /home/ubuntu/桌面/CoreDump/TestCoreDump
00600000-00601000 r--p 00000000 fc:01 265244                             /home/ubuntu/桌面/CoreDump/TestCoreDump
00601000-00602000 rw-p 00001000 fc:01 265244                             /home/ubuntu/桌面/CoreDump/TestCoreDump
01f74000-01f95000 rw-p 00000000 00:00 0                                  [heap]
7f6a84a94000-7f6a84aaa000 r-xp 00000000 fc:01 660680                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f6a84aaa000-7f6a84ca9000 ---p 00016000 fc:01 660680                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f6a84ca9000-7f6a84caa000 rw-p 00015000 fc:01 660680                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f6a84caa000-7f6a84e6a000 r-xp 00000000 fc:01 660642                     /lib/x86_64-linux-gnu/libc-2.23.so
7f6a84e6a000-7f6a8506a000 ---p 001c0000 fc:01 660642                     /lib/x86_64-linux-gnu/libc-2.23.so
7f6a8506a000-7f6a8506e000 r--p 001c0000 fc:01 660642                     /lib/x86_64-linux-gnu/libc-2.23.so
7f6a8506e000-7f6a85070000 rw-p 001c4000 fc:01 660642                     /lib/x86_64-linux-gnu/libc-2.23.so
7f6a85070000-7f6a85074000 rw-p 00000000 00:00 0 
7f6a85074000-7f6a8509a000 r-xp 00000000 fc:01 660614                     /lib/x86_64-linux-gnu/ld-2.23.so
7f6a85280000-7f6a85283000 rw-p 00000000 00:00 0 
7f6a85298000-7f6a85299000 rw-p 00000000 00:00 0 
7f6a85299000-7f6a8529a000 r--p 00025000 fc:01 660614                     /lib/x86_64-linux-gnu/ld-2.23.so
7f6a8529a000-7f6a8529b000 rw-p 00026000 fc:01 660614                     /lib/x86_64-linux-gnu/ld-2.23.so
7f6a8529b000-7f6a8529c000 rw-p 00000000 00:00 0 
7ffd4e97f000-7ffd4e9a0000 rw-p 00000000 00:00 0                          [stack]
7ffd4e9fb000-7ffd4e9fe000 r--p 00000000 00:00 0                          [vvar]
7ffd4e9fe000-7ffd4ea00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
已放弃 (核心已转储)

  若没有core dumped(核心已转储)字样,这说明CoreDump功能没有使能,请跳转CoreDump调试指南:CoreDump使能章节查看,并开启CoreDump功能。

解析Dump文件

  这里使用gdb用于解析CoreDump文件,gdb -c <CoreDumpFile> <app>命令用于进入gdb控制台。

  什么,你找不到<CoreDumpFile>在哪?请跳转CoreDump调试指南:3、CoreDump输出章节查看,并根据实际情况找到<CoreDumpFile>文件。

root@kvm:~/CoreDump# gdb -c TestCoreDump-2582-1712581675 TestCoreDump
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from TestCoreDump...done.
[New LWP 2582]

warning: Unexpected size of section `.reg-xstate/2582' in core file.
Core was generated by `./TestCoreDump'.
Program terminated with signal SIGABRT, Aborted.

warning: Unexpected size of section `.reg-xstate/2582' in core file.
#0  0x00007f6a84cdf438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54      ../sysdeps/unix/sysv/linux/raise.c: 没有那个文件或目录.

  bt命令用于展开堆栈信息,到这里其实就已经知道了代码出现Dump的位置了。in dumpCrash () at TestCoreDump.c:6则代表,Dump问题位于TestCoreDump文件的第六行,问题函数是dumpCrash

(gdb) bt
#0  0x00007f6a84cdf438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007f6a84ce103a in __GI_abort () at abort.c:89
#2  0x00007f6a84d217fa in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7f6a84e3af98 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007f6a84d2e6e8 in malloc_printerr (ar_ptr=0x0, ptr=<optimized out>, str=0x7f6a84e3afc0 "munmap_chunk(): invalid pointer", action=<optimized out>) at malloc.c:5020
#4  munmap_chunk (p=<optimized out>) at malloc.c:2849
#5  __GI___libc_free (mem=<optimized out>) at malloc.c:2970
#6  0x0000000000400542 in dumpCrash () at TestCoreDump.c:6
#7  0x0000000000400553 in main () at TestCoreDump.c:11
(gdb)

  而在源码文件的第六行正好就是我们free一个常量字符串的位置。这当然是不被允许的。

root@kvm:~/CoreDump# nl ./TestCoreDump.c 
     1  #include "stdio.h"
     2  #include "stdlib.h"
     3  void dumpCrash()
     4  {
     5      char *pStr = "test coredump";
     6      free(pStr);
     7  }
       
     8  int main()
     9  {
    10      dumpCrash();
    11      return 0;
    12  }

  那么本篇博客就到此结束了,这里只是记录了一些我个人的学习笔记,其中存在大量我自己的理解。文中所述不一定是完全正确的,可能有的地方我自己也理解错了。如果有些错的地方,欢迎大家批评指正。如有问题直接在对应的博客评论区指出即可,不需要私聊我。我们交流的内容留下来也有助于其他人查看,说不一定也有其他人遇到了同样的问题呢😂。

  • 36
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分成两个分卷进行压缩 《Ubuntu权威指南》目录 目  录 第1章 系统概述与安装 1 1.1 Linux的兴起与发展 2 1.2 充分利用网上资源 3 1.2.1 Ubuntu官方网站 3 1.2.2 GNU网站 4 1.2.3 Linux文档项目网站 4 1.2.4 网上求助 5 1.3 随时查询随机文档 6 1.3.1 使用“--help”选项查询 命令的简单说明 6 1.3.2 使用man命令联机查询 系统参考手册 6 1.3.3 使用info命令查询命令的相关信息 8 1.4 安装Ubuntu Linux系统 9 1.4.1 安装前的准备 10 1.4.2 安装Ubuntu Linux系统 11 1.4.3 安装后的软件维护与更新 16 第2章 GNOME桌面环境 18 2.1 GNOME桌面环境概述 19 2.1.1 GNOME注册界面 19 2.1.2 GNOME桌面环境 20 2.2 GNOME桌面环境浏览 21 2.2.1 GNOME菜单面板 21 2.2.2 GNOME桌面区 24 2.2.3 GNOME窗口面板 26 2.3 应用程序菜单 27 2.3.1 办公 28 2.3.2 附件 29 2.3.3 互联网 31 2.3.4 图形 33 2.3.5 影音 34 2.3.6 游戏 36 2.3.7 添加/删除软件 36 2.4 位置菜单 36 2.4.1 主文件夹 38 2.4.2 桌面、文档等 39 2.4.3 计算机 39 2.4.4 CD/DVD刻录机 39 2.4.5 磁盘分区 40 2.4.6 网络 40 2.4.7 连接到服务器 41 2.4.8 搜索文件 41 2.4.9 最近的文档 42 2.5 系统菜单 42 2.5.1 首选项 42 2.5.2 系统管理 45 2.5.3 锁住屏幕 51 2.5.4 注销 51 2.5.5 关机 51 2.6 使用移动存储设备 51 2.6.1 浏览移动存储介质 52 2.6.2 写入移动存储介质 53 2.7 定制GNOME桌面环境 54 2.7.1 定制面板 54 2.7.2 定制桌面背景 54 2.7.3 定制菜单面板 55 第3章 命令行基础知识 56 3.1 命令行结构 57 3.2 后台进程 60 3.3 标准输入/标准输出与标准错误 ?输出 61 3.4 输入/输出重定向 61 3.5 管道 65 3.6 元字符与文件名生成 67 3.7 转义与引用 69 3.8 命令历史 72 3.8.1 fc命令 72 3.8.2 history命令 74 3.8.3 重复执行先前的命令 75 3.8.4 编辑并执行校正后的命令 76 3.8.5 命令行补充 77 3.9 命令别名 79 3.10 作业控制 81 3.11 会话记录与命令确认 83 3.11.1 保存会话记录 83 3.11.2 确保使用的命令是 ??正确的 84 第4章 文件系统基础知识 86 4.1 文件系统的层次结构 87 4.1.1 树形层次结构 87 4.1.2 路径名 88 4.2 文件系统的组织结构 88 4.3 文件的类型 92 4.3.1 普通文件 92 4.3.2 目录文件 94 4.3.3 特殊文件 95 4.3.4 链接文件 98 4.3.5 符号链接文件 99 4.3.6 管道文件 101 4.4 文件的安全保护机制 101 4.4.1 显示文件的访问权限 102 4.4.2 修改文件的访问权限 103 4.4.3 设置文件的访问权限 104 4.4.4 其他访问权限设置 106 第5章 文件和目录操作 107 5.1 创建文件 108 5.2 显示文件列表 108 5.2.1 使用ls命令显示文件 列表 108 5.2.2 利用通配符显示文件 110 5.2.3 显示隐藏文件 111 5.2.4
分成两个分卷进行压缩 《Ubuntu权威指南》目录 目  录 第1章 系统概述与安装 1 1.1 Linux的兴起与发展 2 1.2 充分利用网上资源 3 1.2.1 Ubuntu官方网站 3 1.2.2 GNU网站 4 1.2.3 Linux文档项目网站 4 1.2.4 网上求助 5 1.3 随时查询随机文档 6 1.3.1 使用“--help”选项查询 命令的简单说明 6 1.3.2 使用man命令联机查询 系统参考手册 6 1.3.3 使用info命令查询命令的相关信息 8 1.4 安装Ubuntu Linux系统 9 1.4.1 安装前的准备 10 1.4.2 安装Ubuntu Linux系统 11 1.4.3 安装后的软件维护与更新 16 第2章 GNOME桌面环境 18 2.1 GNOME桌面环境概述 19 2.1.1 GNOME注册界面 19 2.1.2 GNOME桌面环境 20 2.2 GNOME桌面环境浏览 21 2.2.1 GNOME菜单面板 21 2.2.2 GNOME桌面区 24 2.2.3 GNOME窗口面板 26 2.3 应用程序菜单 27 2.3.1 办公 28 2.3.2 附件 29 2.3.3 互联网 31 2.3.4 图形 33 2.3.5 影音 34 2.3.6 游戏 36 2.3.7 添加/删除软件 36 2.4 位置菜单 36 2.4.1 主文件夹 38 2.4.2 桌面、文档等 39 2.4.3 计算机 39 2.4.4 CD/DVD刻录机 39 2.4.5 磁盘分区 40 2.4.6 网络 40 2.4.7 连接到服务器 41 2.4.8 搜索文件 41 2.4.9 最近的文档 42 2.5 系统菜单 42 2.5.1 首选项 42 2.5.2 系统管理 45 2.5.3 锁住屏幕 51 2.5.4 注销 51 2.5.5 关机 51 2.6 使用移动存储设备 51 2.6.1 浏览移动存储介质 52 2.6.2 写入移动存储介质 53 2.7 定制GNOME桌面环境 54 2.7.1 定制面板 54 2.7.2 定制桌面背景 54 2.7.3 定制菜单面板 55 第3章 命令行基础知识 56 3.1 命令行结构 57 3.2 后台进程 60 3.3 标准输入/标准输出与标准错误 ?输出 61 3.4 输入/输出重定向 61 3.5 管道 65 3.6 元字符与文件名生成 67 3.7 转义与引用 69 3.8 命令历史 72 3.8.1 fc命令 72 3.8.2 history命令 74 3.8.3 重复执行先前的命令 75 3.8.4 编辑并执行校正后的命令 76 3.8.5 命令行补充 77 3.9 命令别名 79 3.10 作业控制 81 3.11 会话记录与命令确认 83 3.11.1 保存会话记录 83 3.11.2 确保使用的命令是 ??正确的 84 第4章 文件系统基础知识 86 4.1 文件系统的层次结构 87 4.1.1 树形层次结构 87 4.1.2 路径名 88 4.2 文件系统的组织结构 88 4.3 文件的类型 92 4.3.1 普通文件 92 4.3.2 目录文件 94 4.3.3 特殊文件 95 4.3.4 链接文件 98 4.3.5 符号链接文件 99 4.3.6 管道文件 101 4.4 文件的安全保护机制 101 4.4.1 显示文件的访问权限 102 4.4.2 修改文件的访问权限 103 4.4.3 设置文件的访问权限 104 4.4.4 其他访问权限设置 106 第5章 文件和目录操作 107 5.1 创建文件 108 5.2 显示文件列表 108 5.2.1 使用ls命令显示文件 列表 108 5.2.2 利用通配符显示文件 110 5.2.3 显示隐藏文件 111 5.2.4 递归地列出文件 112 5.3 显示文件内容 113 5.3.1 使用cat命令显示文件 113 5.3.2 使用more命令分页显示 文件 113 5.3.3 使用less命令分页显示 文件 114 5.3.4 使用head命令显示文件 前几行内容 115 5.3.5 使用tail命令显示文件 最后几行内容 116 5.4 复制文件 116 5.5 移动文件 117 5.6 删除文件 118 5.7 显示当前工作目录 119 5.8 改换目录 119 5.9 创建目录 121 5.10 移动目录 121 5.11 复制目录 121 5.12 删除目录 122 5.13 比较文件之间的差别 123 5.13.1 使用diff命令比较两个 ??文件 123 5.13.2 使用diff3命令比较3个 ??文件 123 5.14 从系统中检索文件 124 5.14.1 简单检索 126 5.14.2 使用逻辑运算符 126 5.14.3 利用find命令本身实现 ??其他处理功能 126 5.14.4 利用管道实现其他 ??处理功能 127 5.15 检索文件内容 127 5.15.1 利用grep检索文件 ??内容 127 5.15.2 过滤其他命令的输出 ??数据 128 5.15.3 使用grep检索多个文件 128 5.15.4 检索不包含特定字符 ??串的文本行 129 5.15.5 在grep中使用正则 ??表达式 129 5.15.6 检索元字符本身 131 5.15.7 在命令行中使用引号 131 5.16 排序 132 第6章 编辑文件 133 6.1 启动vim编辑器 134 6.1.1 创建文件 134 6.1.2 状态行 135 6.2 vim编辑器的两种工作模式 135 6.2.1 输入模式 135 6.2.2 命令模式 135 6.3 保存编辑的文件并退出vim 136 6.4 vim编辑器的基本命令 137 6.4.1 移动光标位置 137 6.4.2 输入文本 138 6.4.3 修改与替换文本 138 6.4.4 撤销先前的修改 139 6.4.5 删除文本 139 6.4.6 复制、删除与粘贴文本 140 6.4.7 按指定的数量重复执行 命令 141 6.5 使用ex命令 141 6.5.1 显示行号 141 6.5.2 多行复制 142 6.5.3 移动文本行 142 6.5.4 删除文本行 142 6.6 检索与替换 142 6.6.1 检索字符串 142 6.6.2 模式检索 143 6.6.3 替换字符串 144 6.7 编辑多个文件 145 6.7.1 编辑多个文件 145 6.7.2 合并文件与合并文本行 145 6.8 定制vim编辑器的运行环境 145 6.8.1 临时设定vim的运行 环境 145 6.8.2 永久性地定制vim的 运行环境 148 6.9 其他特殊说明 148 6.9.1 删除或替换特殊字符 148 6.9.2 在编辑期间运行Linux 命令 149 6.10 vim编辑器命令总结 149 第7章 Shell基础知识 153 7.1 引言 154 7.1.1 为什么需要Shell编程 154 7.1.2 什么是Shell脚本 155 7.1.3 运行Shell脚本 155 7.1.4 退出与出口状态 156 7.1.5 调用适当的Shell解释 程序 158 7.1.6 位置参数 159 7.2 变量与变量替换 161 7.2.1 变量分类 162 7.2.2 变量的赋值 162 7.2.3 内部变量 163 7.2.4 变量的引用与替换 165 7.2.5 变量的间接引用 167 7.2.6 特殊的变量替换 167 7.2.7 变量声明与类型定义 170 7.3 命令与命令替换 171 7.3.1 Shell内部命令 171 7.3.2 部分命令介绍 174 7.3.3 命令替换 183 7.4 test语句 185 7.4.1 文件测试运算符 186 7.4.2 字符串测试运算符 187 7.4.3 整数值测试运算符 188 7.4.4 逻辑运算符 189 7.5 命令行的解释执行过程 190 7.5.1 读取命令行 191 7.5.2 命令历史替换 191 7.5.3 别名替换 192 7.5.4 花括号扩展 192 7.5.5 波浪号替换 192 7.5.6 I/O重定向 193 7.5.7 变量替换 194 7.5.8 算术运算结果替换 195 7.5.9 命令替换 195 7.5.10 单词解析 195 7.5.11 文件名生成 196 7.5.12 引用字符处理 197 7.5.13 进程替换 197 7.5.14 环境处理 198 7.5.15 执行命令 198 7.5.16 跟踪执行过程 199 第8章 Shell高级编程 200 8.1 if条件语句 201 8.1.1 if语句的表现形式 201 8.1.2 嵌套的if-then 条件测试 202 8.1.3 if-then结构参考 204 8.2 case分支语句 205 8.3 for循环语句 207 8.4 while循环语句 210 8.5 until循环语句 212 8.6 select循环语句 213 8.7 嵌套的循环 214 8.8 循环控制与辅助编程命令 215 8.8.1 break和continue命令 215 8.8.2 true命令 217 8.8.3 sleep命令 217 8.8.4 shift命令 217 8.8.5 getopt命令 218 8.8.6 getopts命令 219 8.9 循环语句的I/O重定向 221 8.9.1 while循环的I/O重定向 221 8.9.2 until循环的I/O重定向 222 8.9.3 for循环的I/O重定向 222 8.10 Here文档 223 8.11 Shell函数 227 8.12 逻辑与和逻辑或并列结构 232 8.12.1 逻辑与命令并列结构 232 8.12.2 逻辑或命令并列结构 233 8.13 Shell数组 233 8.14 信号的捕捉与处理 238 8.15 其他Shell课题 241 8.15.1 子Shell 241 8.15.2 Shell脚本的调试 242 8.15.3 系统性能考虑 246 第9章 进程管理 248 9.1 ps命令概述 249 9.2 查询进程及其状态信息 251 9.2.1 查询当前活动的进程 251 9.2.2 查询系统中的所有进程 251 9.2.3 显示进程的重要状态 信息 252 9.2.4 显示进程的详细状态 信息 253 9.2.5 显示进程间的调用关系 253 9.2.6 pstree命令 254 9.3 监控进程及系统资源 255 9.4 终止进程的运行 259 9.5 调整分时进程的优先级 261 9.5.1 nice命令 261 9.5.2 renice命令 263 9.5.3 调整进程优先级的作用 263 第10章 proc文件系统 265 10.1 进程内存映像文件 266 10.2 系统配置信息 270 10.3 系统运行状态信息 273 10.4 系统可调参数 276 10.4.1 文件系统可调参数 277 10.4.2 系统内核可调参数 277 10.4.3 sysctl命令 281 10.5 其他重要的子目录 282 第11章 磁盘空间管理 285 11.1 查询磁盘空间信息 286 11.1.1 常用的磁盘空间 ??管理工具 286 11.1.2 使用df命令检查磁盘 ??空间的使用情况 286 11.1.3 使用du命令检查目录 ??占用的存储空间 289 11.1.4 使用find命令找出超过 ??一定容量限制的文件 290 11.1.5 使用find命令找出并删除 ??长期闲置不用的文件 290 11.1.6 使用find命令找出并删除 ??core文件 292 11.1.7 使用ls命令检测文件的 ??大小 292 11.2 采用标准工具备份与恢复数据 292 11.2.1 利用cpio实现备份和 ??恢复 294 11.2.2 利用tar实现备份和 ??恢复 298 11.2.3 利用dd实现文件系统的 ??原样复制 304 11.3 采用专用工具备份与恢复数据 305 11.3.1 利用dump命令实现数据的 ??备份 306 11.3.2 利用restore命令实现 ??数据的恢复 308 11.4 文件系统限额管理 310 11.4.1 限额概述 310 11.4.2 设置限额 312 11.4.3 限额的维护 315 第12章 软件管理 318 12.1 软件管理概述 319 12.1.1 软件维护工具 319 12.1.2 软件管理基本概念 319 12.2 利用apt-get管理软件包 321 12.2.1 安装软件包 323 12.2.2 系统的更新与升级 324 12.2.3 删除软件包 325 12.2.4 安装本地存储介质中的 ??软件包 325 12.2.5 sources.list配置文件 325 12.3 利用aptitude管理软件包 327 12.3.1 安装软件包 329 12.3.2 系统的升级 330 12.3.3 查询软件包 330 12.3.4 检索软件包 330 12.3.5 删除软件包 332 12.3.6 图形界面 333 12.4 synaptic图形界面软件管理 工具 333 12.4.1 浏览软件包 335 12.4.2 安装软件包 335 12.4.3 删除软件包 336 12.4.4 软件升级 337 12.5 GNOME软件增删工具 338 12.6 软件包的自动更新 339 第13章 用户管理 341 13.1 增加与删除用户 342 13.1.1 /etc/passwd文件 342 13.1.2 /etc/shadow文件 343 13.1.3 用户管理实例 344 13.2 定制用户的工作环境 349 13.2.1 选择命令解释程序 349 13.2.2 设置用户初始化文件 351 12.2.3 定制Shell工作环境 353 13.3 增加与删除用户组 359 13.4 监控用户 360 13.4.1 利用who命令查询 ??系统中的用户 361 13.4.2 利用finger命令查询 ??系统中的用户 362 13.4.3 利用w命令查询系统 ??中的用户活动 362 13.4.4 向注册用户发送消息 362 13.5 插件式认证模块 363 13.5.1 配置文件、模块类型与 ??控制标志 363 13.5.2 修改PAM配置文件 366 13.6 超级用户与sudo命令 366 13.6.1 超级用户的访问控制 367 13.6.2 利用sudo运行特权 ??命令 368 13.6.3 sudoers配置文件 369 13.6.4 admin用户组成员的 ??访问权限 373 13.6.5 直接使用root注册 373 13.6.6 以不同的用户身份 ??访问系统 373 第14章 系统启动与关机 375 14.1 磁盘分区与GRUB 376 14.1.1 磁盘分区 376 14.1.2 GRUB 378 14.1.3 GRUB配置文件 379 14.1.4 安装或修复GRUB 381 14.2 初始引导过程 383 14.2.1 GRUB引导过程概述 384 14.2.2 补充说明 386 14.3 系统生成过程 386 14.3.1 基本概念 388 14.3.2 init进程与/etc/event.d ??目录 391 14.3.3 启动用户定义的应用 ??程序 394 14.4 Login进程 395 14.4.1 login进程与passwd ??文件 395 14.4.2 Shell进程与profile ??文件 395 14.5 系统关机过程 396 14.5.1 使用shutdown命令 ??关闭系统 396 14.5.2 使用init命令关闭系统 397 14.5.3 使用其他命令关机 397 第15章 作业调度与系统日志 398 15.1 定时运行后台作业 399 15.1.1 cron守护进程的 ??调度过程 399 15.1.2 at作业与atd守护进程 400 15.1.3 调度错失执行时间 ??的任务 401 15.2 调度重复执行的任务 402 15.2.1 crontab文件的工作原理 402 15.2.2 创建和编辑crontab ??文件 404 15.2.3 显示crontab文件 405 15.2.4 删除crontab文件 405 15.2.5 crontab命令的访问控制 405 15.2.6 应用实例—数据库 ??定时备份 406 15.3 调度一次性执行的作业 407 15.3.1 提交at作业 408 15.3.2 显示at作业及作业队列 409 15.3.3 删除at作业 409 15.3.4 at命令的访问控制 409 15.3.5 应用实例—系统 ??定时关机 410 15.4 系统日志 411 15.4.1 系统日志文件 412 15.4.2 应用程序日志文件 413 15.4.3 无法直接查阅的日志 413 15.4.4 系统日志守护进程 414 第16章 文件系统内部组织 417 16.1 文件系统的组织结构 418 16.1.1 引导块 419 16.1.2 数据块组 419 16.2 超级块 422 16.3 信息节点 424 16.3.1 文件的类型与访问权限 426 16.3.2 数据块地址数组 426 16.3.3 符号链接文件 427 16.3.4 特权标志位 427 16.4 信息节点与目录及文件的关系 428 16.4.1 目录文件 428 16.4.2 目录、文件和信息节点 ???三者之间的关系 429 第17章 文件系统管理 431 17.1 划分磁盘分区 432 17.2 创建文件系统 434 17.2.1 mkfs或mke2fs命令 ??介绍 434 17.2.2 创建Ext2/Ext3文件 ??系统 436 17.3 调整文件系统 437 17.4 安装与卸载文件系统 439 17.4.1 安装文件系统概述 439 17.4.2 mount命令 440 17.4.3 /etc/fstab文件 441 17.4.4 安装文件系统 442 17.4.5 卸载文件系统 444 17.5 检测与修复文件系统 446 17.5.1 何时需要检测文件系统 447 17.5.2 文件系统检测的内容 448 17.5.3 交互地检测与修复 ??文件系统 452 17.5.4 自动检测与修复文件 ??系统 453 17.5.5 恢复严重受损的超级块 454 17.5.6 解决fsck命令无法修复 ??的文件系统问题 454 17.5.7 fsck的阶段处理方式 455 17.6 调试文件系统 458 17.6.1 概述 458 17.6.2 交互式调试子命令 459 17.6.3 应用举例1—恢复 ??误删的文件 464 17.6.4 应用举例2—恢复 ??误删的文件 465 17.7 其他文件系统维护工具 467 17.7.1 dumpe2fs命令 467 17.7.2 e2image命令 468 第18章 TCP/IP网络管理 470 18.1 TCP/IP简介 471 18.1.1 TCP/IP的层次结构 471 18.1.2 TCP/IP如何处理数据 ??通信 473 18.2 网络接口设置 475 18.2.1 以太网络设置 475 18.2.2 ADSL网络连接 480 18.3 主机名字解析 483 18.4 网络路由设置 484 18.5 配置网络服务 485 18.6 网络管理与维护 487 18.6.1 使用ifconfig命令维护 ??网络接口 487 18.6.2 使用netstat命令监控 ??网络状态 489 18.6.3 使用ping命令测试远程 ??主机的连通性 494 18.6.4 使用ping命令检测网络 ??主机的性能 495 18.6.5 使用ftp命令检测网络 ??主机的传输性能 496 18.6.6 使用traceroute命令跟踪 ??路由信息 496 18.6.7 利用tcpdump捕捉、分析 ??网络分组数据 497 第19章 TCP/IP网络应用 501 19.1 OpenSSH 502 19.1.1 安装OpenSSH服务器 502 19.1.2 /etc/ssh/sshd_config ??配置文件 502 19.1.3 使用SSH注册到 ??远程系统 505 19.1.4 使用ssh执行远程系统 ??中的命令 506 19.1.5 使用SCP替代FTP 506 19.1.6 使用SFTP替代FTP 507 19.1.7 SSH与SCP的无 ??密码注册 508 19.1.8 OpenSSH的安全考虑 510 19.2 Telnet远程注册 510 19.2.1 设置Telnet服务器 511 19.2.2 Telnet服务器的安全 ??考虑 512 19.3 FTP文件传输 513 19.3.1 设置vsftpd 513 19.3.2 vsftpd.conf配置文件 513 19.3.3 FTP安全考虑 517 19.3.4 FTP应用 518 19.3.5 FTP自动注册 519 第20章 DNS域名服务器 521 20.1 DNS基本概念 522 20.1.1 域与区 522 20.1.2 DNS域名服务器 523 20.1.3 DNS域名与地址解析 524 20.2 DNS配置文件 526 20.2.1 resolv.conf文件 527 20.2.2 named.conf配置文件 528 20.2.3 区配置文件 532 20.2.4 DNS资源记录 533 20.3 DNS服务器配置过程 537 20.3.1 设置resolv.conf配置 ??文件 537 20.3.2 设置named.conf配置 ??文件 537 20.3.3 设置正向区配置文件 538 20.3.4 设置反向区配置文件 539 20.3.5 DNS视图 540 20.3.6 检测配置文件 543 20.4 测试DNS服务器 544 20.4.1 验证DNS服务器 544 20.4.2 dig命令 545 第21章 NFS网络文件系统 548 21.1 NFS简述 549 21.2 配置NFS服务器 550 21.2.1 安装NFS服务器 ??软件包 550 21.2.2 /etc/exports文件 551 21.2.3 采用图形界面配置NFS ??共享资源 553 21.2.4 验证NFS共享资源的 ??配置 555 21.3 配置NFS客户系统 557 21.3.1 安装远程文件系统 557 21.3.2 设置/etc/fstab文件 558 21.4 NFS自动安装 559 21.4.1 主映射文件 559 21.4.2 直接映射文件 560 21.4.3 间接映射文件 560 21.5 NFS故障修复 561 21.5.1 基本工具 561 21.5.2 其他注意事项 564 第22章 amba资源共享 565 22.1 安装Samba服务器 566 22.2 smb.conf配置文件 567 22.2.1 smb.conf配置文件概述 568 22.2.2 Global节 569 22.2.3 homes节 572 22.2.4 printers节 574 22.3 快速设置Samba服务器 575 22.3.1 设定Samba服务器的 ??工作组或域 575 22.3.2 设置Samba用户认证 ??信息 576 22.3.3 共享用户主目录 577 22.3.4 共享其他目录 577 22.3.5 共享打印机 578 22.3.6 验证Samba配置文件 579 22.4 Samba运行环境测试 580 22.4.1 在Linux系统中测试 ??Samba服务器 580 22.4.2 从Windows系统中 ??连接Samba服务器 583 22.5 访问共享资源 584 22.5.1 从Windows系统中访问 ??Samba服务器 584 22.5.2 从Linux系统中访问 Windows服务器 585 第23章 Apache服务器 588 23.1 Apache服务器概述 589 23.2 启动Apache服务器 589 23.2.1 Apache软件包的目录 ??结构 589 23.2.2 apache2守护进程 590 23.2.3 设置Apache启动脚本 591 23.2.4 Apache模块 592 23.3 配置Apache服务器 592 23.3.1 Apache配置文件 593 23.3.2 .htaccess文件 594 23.3.3 配置指令 594 23.4 用户目录 599 23.4.1 利用UserDir设定 ??目录路径 600 23.4.2 限定用户目录的使用 600 23.4.3 开放用户CGI目录 600 23.5 虚拟主机 601 23.5.1 配置基于主机名的虚拟 主机 602 23.5.2 配置基于IP地址的 ??虚拟主机 603 23.5.3 利用不同的IP地址提供 ??相同的网站服务 604 23.5.4 利用不同的端口提供 ??不同的网站服务 604 23.6 利用CGI提供动态内容服务 605 23.6.1 启用CGI程序 605 23.6.2 编写CGI程序 606 23.6.3 CGI的安全考虑与 ??suexec 608 23.6.4 Apache与LAMP 609 23.7 用户认证 610 23.7.1 用户认证的实现 610 23.7.2 用户认证方法的补充 ??说明 612 23.8 日志文件 613 23.8.1 错误日志文件 614 23.8.2 访问日志文件 615 23.8.3 虚拟主机日志 617 第24章 MySQL数据库 618 24.1 安装与配置MySQL数据库 619 24.1.1 安装MySQL数据库 619 24.1.2 my.cnf配置文件 619 24.1.3 MySQL数据库命令行 界面 621 24.1.4 MySQL数据库图形界面 622 24.1.5 设置数据库用户及其 ??访问权限 624 24.2 访问MySQL数据库 624 24.2.1 创建、查询、使用与删除 数据库 624 24.2.2 创建、查询与删除数 据库表 625 24.2.3 录入数据 626 24.3 查询MySQL数据库 627 24.3.1 查询数据库表 627 24.3.2 查询数据库表结构 628 24.3.3 查询数据库表中的数据 内容 628 24.4 SQL脚本与批处理 628 24.5 MySQL数据库 630 24.5.1 数据库备份方法 630 24.5.2 MySQL数据库备份 631 24.5.3 MySQL数据库恢复 632 24.5.4 MySQL数据库表的 备份与恢复 633 24.5.5 增量备份与恢复 633 24.6 密码维护与网络安全 635 24.6.1 维护数据库管理员密码 635 24.6.2 恢复数据库管理员密码 636 24.6.3 基本网络安全考虑 637 参考文献 638
第1章 介绍 1.1 Web缓存 1.2 Squid的简明历史 1.3 硬件和操作系统要求 1.4 squid是开源的 1.5 Squid的Web主页 1.6 获取帮助 1.6.1 FAQ 1.6.2 邮件列表 1.6.3 职业支持 1.7 启动Squid 第2章 获取Squid 2.1 版本和发布 2.2 使用源代码 2.3 预编译的二进制文件 2.4 匿名CVS 2.5 devel.squid-cache.org 第3章 编译和安装 3.1 安装之前 3.2 解开源代码包 3.3 调整内核 3.3.1 文件描述符 3.3.2 Mbuf Clusters 3.3.3 临时端口范围 3.4 Configure脚本 3.4.1 configure选项 3.4.2 运行configure 3.5 编译 3.6 安装 3.7 打补丁 3.8 重运行configure 第4章 快速配置向导 4.1 squid.conf语法 4.2 User ID 4.3 端口号 4.4 日志文件路径 4.5 访问控制 4.6 可见主机名 4.7 管理联系信息 4.8 下一步 第5章 运行Squid 5.1 squid命令行选项 5.2 对配置文件查错 5.3 初始化cache目录 5.4 在终端窗口里测试squid 5.5 将squid作为服务进程运行 5.5.1 squid_start脚本 5.6 启动脚本 5.6.1 /etc/rc.local 5.6.2 init.d和rc.d 5.6.3 /etc/inittab 5.7 chroot环境 5.8 停止squid 5.9 重配置运行中的squid进程 5.10 滚动日志文件 6.访问控制 6.1 访问控制元素 6.1.1 一些基本的ACL类型 6.1.2 ACL类型 6.1.3 外部ACL 6.1.4 处理长ACL列表 6.1.5 Squid如何匹配访问控制元素 6.2 访问控制规则 6.2.1 访问规则语法 6.2.2 Squid如何匹配访问规则 6.2.3 访问列表风格 6.2.4 延时检查 6.2.5 减缓和加速规则检查 6.3 常见用法 6.3.1 仅仅允许本地客户 6.3.2 阻止恶意客户 6.3.3 内容过滤 6.3.4 在工作时间的受限使用 6.3.5 阻止squid与非HTTP服务器会话 6.3.6 授予某些用户特殊的访问 6.3.7 阻止邻近cache的滥用 6.3.8 使用IP地址拒绝请求 6.3.9 http_reply_access示例 6.3.10 阻止对本地站点的cache命中 6.4 测试访问控制 7.磁盘缓存基础 7.1 cache_dir指令 7.1.1 参数:Scheme 7.1.2 参数:Directory 7.1.3 参数:Size 7.1.4 参数:L1和L2 7.1.5 参数:Options 7.2 磁盘空间基准 7.3 对象大小限制 7.4 分配对象到缓存目录 7.5 置换策略 7.6 删除缓存对象 7.6.1 删除个别对象 7.6.2 删除一组对象 7.6.3 删除所有对象 7.7 refresh_pattern 第8章 高级磁盘缓存主题 8.1 是否存在磁盘I/O瓶颈? 8.2 文件系统调整选项 8.3 可选择的文件系统 8.4 aufs存储机制 8.4.1 aufs如何工作 8.4.2 aufs发行 8.4.3 监视aufs操作 8.5 diskd存储机制 8.5.1 diskd如何工作 8.5.2 编译和配置diskd 8.5.3 监视diskd 8.6 coss存储机制 8.6.1 coss如何工作 8.6.2 编译和配置coss 8.6.3 coss发行 8.7 null存储机制 8.8 哪种最适合我? 第9章 Cache拦截 9.1它如何工作? 9.2为何要(或不要)拦截? 9.3 网络设备 9.3.1 内置Squid 9.3.2 四层交换 9.3.3 Cisco策略路由 9.3.4 Web Cache Coordination协议 9.4 操作系统配置 9.4.1 Linux 9.4.2 FreeBSD 9.4.3 OpenBSD 9.4.4 在NetBSD和其他系统上的IPFilter 9.5 配置Squid 9.5.1 配置WCCPv1 9.6 调试问题 第10章 与其他Squid会话 10.1 某些术语 10.2 为何要(或不要)使用堆叠? 10.3 配置Squid与邻居通信 10.3.1 cache_peer选项 10.3.2 邻居状态 10.3.3 改变关系 10.4 对邻居的请求限制 10.4.1 cache_peer_access 10.4.2 cache_peer_domain 10.4.3 never_direct 10.4.4 always_direct 10.4.5 hierarchy_stoplist 10.4.6 nonhierarchical_direct 10.4.7 prefer_direct 10.5 网络度量数据库(netdb) 10.6 Internet Cache协议(ICP) 10.6.1 成为ICP服务器 10.6.2 成为ICP客户 10.6.3 广播ICP 10.7 Cache摘要(Cache Digest) 10.7.1 配置squid的cache摘要 10.8 超文本cache协议(HTCP) 10.8.1 配置Squid使用HTCP 10.9 Cache数组路由协议(CARP) 10.9.1 配置Squid使用CARP 10.10 归纳所有 10.10.1 步骤1:直接决定选项 10.10.2 步骤2:邻居选择协议 10.10.3 步骤2a:ICP/HTCP应答处理 10.10.4 步骤3:从父cache选择 10.10.5 重试 10.11 该怎么做? 10.11.1 通过另外的代理发送所有请求? 10.11.2 通过另外的代理发送所有请求,除非它down了? 10.11.3 确认squid对某些请求,不使用邻居cache吗? 10.11.4 通过父cache发送某些请求来绕过本地过滤器? 第11章 重定向器 11.1 重定向器接口 11.1.1 处理包含空格的URI 11.1.2 产生HTTP重定向消息 11.2 重定向器示例 11.3 重定向器池 11.4 配置Squid 11.4.1 redirect_program 11.4.2 redirect_children 11.4.3 redirect_rewrites_host_header 11.4.4 redirector_access 11.4.5 redirector_bypass 11.5 流行的重定向器 11.5.1 Squirm 11.5.2 Jesred 11.5.3 squidGuard 11.5.4 AdZapper 第12章 验证辅助器 12.1 配置Squid 12.2 HTTP基本验证 12.2.1 NCSA 12.2.2 LDAP 12.2.3 MSNT 12.2.4 Multi-domain-NTLM 12.2.5 PAM 12.2.6 SASL 12.2.7 SMB 12.2.8 YP 12.2.9 getpwnam 12.2.10 winbind 12.2.11 基本验证API 12.3 HTTP摘要验证 12.3.1 password 12.3.2 摘要验证API 12.4 Microsoft NTLM验证 12.4.1 SMB 12.4.2 winbind 12.4.3 NTLM验证API 12.5 外部ACL 12.5.1 ip_user 12.5.2 ldap_group 12.5.3 unix_group 12.5.4 wbinfo_group 12.5.5 winbind_group 12.5.6 编写自己的外部ACL辅助器 第13章 日志文件 13.1 cache.log 13.1.1 debug级别 13.1.2 转发cache.log消息到系统日志 13.1.3 dump cache.log消息到终端 13.2 access.log 13.2.1 access.log结果编码 13.2.2 HTTP响应状态码 13.2.3 access.log对端编码 13.2.4 影响access.log的配置指令 13.2.5 access.log分析工具 13.3 store.log 13.3.1 转换文件号到路径名 13.4 referer.log 13.5 useragent.log 13.6 swap.state 13.7 轮转日志 13.8 隐私和安全 第14章 监视Squid 14.1 cache.log告警 14.2 Cache管理器 14.3 使用SNMP 第15章 服务加速模式 15.1 概述 15.2 配置Squid 15.2.1 http_port 15.2.2 https_port 15.2.3 httpd_accel_host 15.2.4 httpd_accel_port 15.2.5 httpd_accel_uses_host_header 15.2.6 httpd_accel_single_host 15.2.7 httpd_accel_with_proxy 15.3 令人疑惑之处 15.3.1 一个主机,一个主机名 15.3.2 一个主机,多个主机名 15.3.3 多个主机,一个主机名 15.3.4 多个主机,多个主机名 15.4 访问控制 15.5 内容协商 15.6 补充 15.6.1 日志 15.6.2 忽略Reload 15.6.3 不可cache的内容 15.6.4 错误 15.6.5 刷新目标 15.6.6 邻居 第16章 调试和故障处理 16.1 一些通用问题 16.1.1 "Failed to make swap directory" 16.1.2 "Address already in use" 16.1.3 "Could not determine fully qualified hostname" 16.1.4 "DNS name lookup tests failed" 16.1.5 "Illegal character in hostname" 16.1.6 "Running out of filedescriptors" 16.1.7 "icmpRecv: Connection refused" 16.1.8 在运行一段时间后,Squid变慢了 16.1.9 调试访问控制 16.2 通过cache.log进行调试 16.3 Coredump,断点,和堆栈跟踪 16.3.1 不能找到core文件? 16.4 重现问题 16.5 报告Bug
调试coredump时,可以使用gdb来帮助我们定位问题。首先,确保已经安装了gdb工具。接下来,使用gdb打开coredump文件,命令格式为"gdb <可执行文件路径> <coredump文件路径>"。这样就会进入gdb的调试环境。在gdb中,我们可以使用一些命令来获取关于coredump的信息和调试程序。 1. 使用命令"bt"或"backtrace"来查看函数调用栈,这可以告诉我们程序运行到crash的位置之前经过了哪些函数调用。 2. 使用命令"info registers"来查看寄存器的值,这可以帮助我们理解程序在崩溃时的状态。 3. 使用命令"print <变量名>"来查看变量的值,这可以帮助我们了解程序在崩溃时的数据状态。 4. 使用命令"list"来查看源代码,这可以帮助我们找到问题所在的具体代码位置。 5. 使用命令"run"重新运行程序,这可以帮助我们重现coredump并进行调试。 需要注意的是,在调试coredump时,有时候只能从core文件中找出崩溃的直观原因,而更深层次的原因可能需要结合代码和运行上下文来分析。因此,除了使用gdb命令来查看coredump的信息外,还需要对程序的代码进行分析,以便找到问题所在。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [gdb调试coredump(使用篇)](https://blog.csdn.net/jackhh1/article/details/124434307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

becase@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值