Skip to content

Commit 7db4774

Browse files
committed
program debug complete
1 parent 76c46bc commit 7db4774

10 files changed

+1096
-203
lines changed

advance/02_program_debug.rst

+322-62
Large diffs are not rendered by default.

advance/03_optimization.rst

+7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ pmap: 显示进程、虚拟内存,进程使用空间
1212
pmap可以报告某个或多个进程的内存使用情况。使用pmap判断主机中哪个进程因占用过多内存导致内存瓶颈。
1313
strace截取和记录系统进程调用,以及进程收到的信号。是一个非常有效的检测、指导和调试工具。系统管理员可以通过该命令容易地解决程序问题。
1414

15+
pmap 显示进程虚拟内存
16+
^^^^^^^^^^^^^^^^^^^^^^
17+
进程使用空间
18+
19+
20+
还有很多好工具,比如调试内存泄漏的工具valgrind,这里就不在多说,感兴趣的朋友可以google了解;
21+
1522

1623
top 好学习
1724
sh+g 选择屏幕

base/08_user_manage.rst

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ PermissionsMark取值:
115115

116116
$chmod 740 main 将main的用户权限设置为rwxr-----
117117

118+
118119
更改文件或目录的拥有者
119120
^^^^^^^^^^^^^^^^^^^^^^
120121
::

tool/gdb.rst

+89-62
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,102 @@
1-
gdb
1+
.. _gdb:
22

3-
设置断点
4-
-----------------
5-
插入断点的几种方式:
6-
break DASendHandler.cpp:1939
7-
break 16 //在源文件第16行设置断点
8-
break func1 //在函数func1()入口处设置断点
9-
条件断点设置 b fn1 if a>b
10-
注:break可缩写为b
3+
gdb 调试利器
4+
==============
115

12-
info break 查看断点信息
13-
清除所有断点:delete breakpoints
6+
启动gdb
7+
--------------
8+
对C/C++程序的调试,需要在编译前就加上-g选项::
149

10+
$g++ -g hello.cpp -o hello
1511

16-
常用命令
17-
-----------------
18-
r (run) 运行程序
19-
n (next) 单步执行
20-
c (confinue) 继续执行
21-
l (list) 列出当前执行到的周围源码
22-
p (print) 打印变量当前值
23-
>>p i 打印变量i的值
24-
直接回车 重复上一指令
12+
调试可执行文件::
2513

14+
$gdb <program>
15+
program也就是你的执行文件,一般在当前目录下。
2616

17+
调试core文件(core是程序非法执行后core dump后产生的文件):
2718

28-
进阶:
19+
$gdb <program> <core dump file>
20+
$gdb program core.11127
2921

30-
1.对C/C++程序的调试,需要在编译前就加上-g选项;
31-
cc -g hello.c -o hello
32-
g++ -g hello.cpp -o hello
22+
调试服务程序::
3323

34-
启动gdb
35-
--------------
36-
gdb <program>
37-
program也就是你的执行文件,一般在当前目录下。
38-
gdb <program> <core dump file>
39-
>>gdb program core.11127
40-
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
41-
gdb <program> <PID>
42-
>>gdb hello 11127
24+
$gdb <program> <PID>
25+
$gdb hello 11127
4326
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
4427

28+
gdb交互命令
29+
--------------------
30+
启动gdb后,进入到交互模式,通过以下命令完成对程序的调试;注意高频使用的命令一般都会有缩写,熟练使用这些缩写命令能提高调试的效率;
31+
32+
运行
33+
^^^^^^^^^^^^^^^^^^^^
34+
35+
- run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
36+
- continue (简写c ):继续执行,到下一个断点处(或运行结束)
37+
- next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。
38+
- step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
39+
- until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
40+
- until+行号: 运行至某行,不仅仅用来跳出循环
41+
- finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
42+
- call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)
43+
- quit:简记为 q ,退出gdb
44+
45+
设置断点
46+
^^^^^^^^^^^^^^^^^^^^
47+
- break n (简写b n):在第n行处设置断点
48+
(可以带上代码路径和代码名称: b OAGUPDATE.cpp:578)
49+
- b fn1 if a>b:条件断点设置
50+
- break func(break缩写为b):在函数func()的入口处设置断点,如:break cb_button
51+
- delete 断点号n:删除第n个断点
52+
- disable 断点号n:暂停第n个断点
53+
- enable 断点号n:开启第n个断点
54+
- clear 行号n:清除第n行的断点
55+
- info b (info breakpoints) :显示当前程序的断点设置情况
56+
- delete breakpoints:清除所有断点:
57+
58+
59+
查看源代码
60+
^^^^^^^^^^^^^^^^^^^^
61+
- list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
62+
- list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
63+
- list 函数名:将显示“函数名”所在函数的源代码,如:list main
64+
- list :不带参数,将接着上一次 list 命令的,输出下边的内容。
65+
66+
打印表达式
67+
^^^^^^^^^^^^^^^^^^^^
68+
- print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
69+
- print a:将显示整数 a 的值
70+
- print ++a:将把 a 中的值加1,并显示出来
71+
- print name:将显示字符串 name 的值
72+
- print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
73+
- print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
74+
- display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
75+
- watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
76+
- whatis :查询变量或函数
77+
- info function: 查询函数
78+
- 扩展info locals: 显示当前堆栈页的所有变量
79+
80+
81+
查询运行信息
82+
^^^^^^^^^^^^^^^^^^^^
83+
- where/bt :当前运行的堆栈列表;
84+
- bt backtrace 显示当前调用堆栈
85+
- up/down 改变堆栈显示的深度
86+
- set args 参数:指定运行时的参数
87+
- show args:查看设置好的参数
88+
- info program: 来查看程序的是否在运行,进程号,被暂停的原因。
89+
90+
分割窗口
91+
^^^^^^^^^^^^^^^^^^^^
92+
- layout:用于分割窗口,可以一边查看代码,一边测试:
93+
- layout src:显示源代码窗口
94+
- layout asm:显示反汇编窗口
95+
- layout regs:显示源代码/反汇编和CPU寄存器窗口
96+
- layout split:显示源代码和反汇编窗口
97+
- Ctrl + L:刷新窗口
98+
99+
.. note::
45100

46-
info function 查询函数
47-
扩展info locals 显示当前堆栈页的所有变量
48-
TAB自动补全
49-
对于有命名空间的补全 需要加单引号
50-
bt backtrace 显示当前调用堆栈
51-
up 改变堆栈显示的深度
52-
down
53-
watch 设置观嚓点
54-
55-
p/x a 十六进制显示a的值
56-
x 也是打印 只针对地址和原始数据
57-
x/d &a 十进制显示a的地址
58-
call getpid()调用程序中可见的函数
59-
whatis 查询变量或函数
60-
连接正在运行的进程 gdb procer pid
61-
调试core
62-
几种产生原因
63-
SIGSEGV 段错误
64-
SIGFEP浮点数错误
65-
SIGABRT 异常中断
66-
SIGBUS 总线错误
67-
强制core ulimit -c unlimited
68-
发送 abort()
69-
raise(SIGABRT)
70-
gdb 的gcore
71-
72-
73-
整合: colin的 gdb的博客;
74-
gdb 调试服务程序
101+
交互模式下直接回车的作用是重复上一指令,对于单步调试非常方便;
75102

tool/lsof.rst

+28-21
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ lsof打开的文件可以是:
4444
-------------------
4545

4646
 实例1:无任何参数
47-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4848
::
4949

5050
/root$lsof| more
@@ -114,7 +114,7 @@ NODE:索引节点(文件在磁盘上的标识)
114114
NAME:打开文件的确切名称
115115

116116
实例2:查看谁正在使用某个文件,也就是说查找某个文件相关的进程
117-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
118118
::
119119

120120
/root$lsof /bin/bash
@@ -125,87 +125,87 @@ NAME:打开文件的确切名称
125125

126126

127127
实例3:列出某个用户打开的文件信息
128-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
128+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
129129
命令:
130130
lsof -u username
131131

132132
说明:
133133
-u 选项,u其实是user的缩写
134134

135135
实例4:列出某个程序进程所打开的文件信息
136-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
136+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
137137
命令:
138138
lsof -c mysql
139139
说明:
140140
-c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符;
141141

142142
实例5:列出多个进程多个打开的文件信息
143-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
144144
命令:
145145
lsof -c mysql -c apache
146146

147147
实例6:列出某个用户以及某个进程所打开的文件信息
148-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
148+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
149149
命令:
150150
lsof -u test -c mysql
151151
说明:
152152
用户与进程可相关,也可以不相关
153153

154154
实例7:通过某个进程号显示该进程打开的文件
155-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
155+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
156156
命令:
157157
lsof -p 11968
158158

159159
实例8:列出所有的网络连接
160-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
160+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
161161
命令:
162162
lsof -i
163163

164164
实例9:列出所有tcp 网络连接信息
165-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
165+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
166166
命令:
167167
lsof -i tcp
168168

169169
实例10:列出所有udp网络连接信息
170-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
170+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
171171
命令:
172172
lsof -i udp
173173

174174
实例11:列出谁在使用某个端口
175-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
175+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
176176
命令:
177177
lsof -i :3306
178178

179179
实例12:列出谁在使用某个特定的udp端口
180-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
180+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
181181
命令:
182182
lsof -i udp:55
183183
或者:特定的tcp端口
184184
命令:
185185
lsof -i tcp:80
186186

187187
实例13:列出某个用户的所有活跃的网络端口
188-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
188+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
189189
命令:
190190
lsof -a -u test -i
191191

192192
实例14:列出所有网络文件系统
193-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
193+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
194194
命令:
195195
lsof -N
196196

197197
实例15:域名socket文件
198-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
198+
^^^^^^^^^^^^^^^^^^^^^^^
199199
命令:
200200
lsof -u
201201

202202
实例16:某个用户组所打开的文件信息
203-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
203+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
204204
命令:
205205
lsof -g 5555
206206

207207
实例17:根据文件描述列出对应的文件信息
208-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
208+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
209209
命令:
210210
lsof -d description(like 2)
211211
例如:lsof -d txt
@@ -215,22 +215,29 @@ lsof -d description(like 2)
215215
0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始
216216

217217
实例18:根据文件描述范围列出文件信息
218-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
218+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
219219
命令:
220220
lsof -d 2-3
221221

222222
实例19:列出COMMAND列中包含字符串" sshd",且文件描符的类型为txt的文件信息
223-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
223+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
224224
命令:
225225
lsof -c sshd -a -d txt
226226

227227
实例20:列出被进程号为1234的进程所打开的所有IPV4 network files
228-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
228+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
229229
命令:
230230
lsof -i 4 -a -p 1234
231231

232232
实例21:列出目前连接主机peida.linux上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令
233-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
233+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
234234
命令:
235235
lsof -i @peida.linux:20,21,22,25,53,80 -r 3
236236

237+
::
238+
239+
$lsof -n -i tcp
240+
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
241+
svnserve 11552 weber 3u IPv4 3799399 0t0 TCP *:svn (LISTEN)
242+
redis-ser 25501 weber 4u IPv4 113150 0t0 TCP 127.0.0.1:6379 (LISTEN)
243+

0 commit comments

Comments
 (0)