当前位置:C++技术网 > 资讯 > Linux下高效的TCP编程内存泄漏内存错误检测调试流程

Linux下高效的TCP编程内存泄漏内存错误检测调试流程

更新时间:2017-05-16 09:43:44浏览次数:1+次

    在Linux中调试TCP服务器程序,一般是这样的流程:
1.查看监听端口
lsof -i:端口号
    结果如下:
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcheck- 16942 root   10u  IPv4  82453      0t0  TCP *:softcm (LISTEN)

    这里可以看到监听此端口号的进程的ID,即PID列显示的数字。第一个为进程或者命令的名称。其他的就不细说。最重要的是PID和进程名称,我们要看这里来判断进程的情况。如果这个命令执行后,没有输入任何结果,则表明此端口没有被监听,或者说监听此端口的程序没有运行,或者说你的程序监听此端口失败。如果你要修改代码,你需要重新编译,那么你需要将这个监听端口的程序关闭。否则新启动的程序就无法再监听此端口了,因为被你这个已经运行的程序占用了。所以要执行第二步。

2.关闭监听端口的进程
kill -9 进程ID
    -9是发送给进程的信号,强制关闭进程的信号。进程ID就可以从第一步运行的结果看到。这样就可以结束进程的运行了。杀死进程之后,为了确认是否真正杀死了进程,你可以执行第一步的命令查看即可,没有结果则表明杀死了进程。进程死掉了,自然就没有进程监听端口,端口就释放了。从这里可以看到,端口使用是进程相关的,进程不存在了,端口自然就没有被占用了。

3.启动运行生成的程序
    进入可执行文件所在的目录,或者直接使用绝对路径,启动进程。比如:
/tmp/test/run
    这样就可以启动run程序了。一般调试运行的会生成Debug目录,这样的话,Debug目录在编译前会被清空文件。如果你将目录切换到Debug目录下,就需要先退出Debug,等编译好后再进入Debug目录启动程序。否则可能即使编译后,在Debug目录中启动程序时提示程序文件不存在,应该是终端没有同步更新状态。此时退出Debug目录,在进去就可以了。或者直接就是用绝对路径就行了。

4.调试运行程序
    我们一般可以用Valgrind的Memcheck(内存检测工具)检测内存泄漏和内存错误。那么我们不仅要找到程序的路径,还要将这个路径传给Valgrind,再添加各种检测选项。如:
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all /tmp/test/run
    此时就进入了调试运行模式了。如果出现错误,就会有详细错误提示。但这个不是我们这里的重点。

    上面4步,你会循环往复的执行,来修改代码并调试程序。每次要切换不同的命令,次数多了,就很麻烦了,效率很低。所以首先能够想到的就是,将各种命令存储在记事本里,然后需要的时候,复制粘贴,运行,OK!
    已经方便了不少,不需要不停的敲命令,或者上下选择历史命令。然而粘贴复制也是会耗时间的。不幸的是,一次我桌面的这个记事本文件没有了,让我烦躁了。后来还是慢慢敲命令。
    最近又要大量的调试,敲命令显然不行。所以还要想办法提高效率。虽然这些命令本身也不复杂,但敲起来还是费事。那我将他们做一番处理,写到脚本文件里如何呢?
    下面就是对工作流程的改造:
1.创建一个可执行程序文件的软链接
    因为可执行程序文件在编译前会被清除,然后再生成。所以不要使用硬链接。软链接就和快捷方式一样的,指向了一个文件,启动快捷方式相当于启动了指向的文件。这样的话,我们软链接一直都有效。
    创建可执行程序软链接命令如下:
ln -s /tmp/test/run /run
    这个命令在根目录下创建了run软链接文件,指向了/tmp/test/run文件。
2.设置软链接的可执行权限
    因为软链接是一个单独的文件,所以我们要执行他,就需要给他指定可执行权限。命令如下:
chmod +x /run
    这样我们就可以像执行可执行文件一样执行软链接了。
3.将valgrind调试选项命令和软链接整合到一个脚本文件里
    前面两步做好后,我们编译和软链接解耦了。编译好就可以执行软链接了。我们此时将软链接和valgrind拼接到一起,并写入一个脚本文件。这样我们执行脚本文件的时候,就启动了调试。如下:
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all /run
    然后将这个脚本文件取名为d,一个字母敲起来方便,即debug的首字母。然后再给d增加一个执行权限:
chmod +x /d
    文件都放在根目录下。当然你也可以放在其他地方。只是根目录方便些,我用的是root账号。然后只要执行d文件就相当于调试了。多方便,一键调试哦。我们在Windows上编写好代码,上传到Linux上,然后就执行d文件调试,检测内存泄漏和内存错误情况。
4.增加查看端口监听情况的脚本文件
    而查看监听的端口的信息的命令也有一串,我们同样将命令写入到脚本里,然后给脚本取名为l,加上可执行权限,运行l就可以查看端口的情况了。是不是也提高了效率呀。
5.增加杀死监听端口的进程的脚本文件
    要说前面的都是比较简单,那么这一步就显得有点复杂了。我们要杀死监听的端口的进程,我们要先查看监听端口的进程,然后将里面显示的进程ID的进程杀死。没有现成的命令可以做到。所以我们要组合命令实现。命令如下:
kill -9 $(lsof -i:端口号 | cut -d ' ' -f 2 | tail -n 1)
    命令先提取端口号信息,然后根据空格剪切PID那一列,再取最后一行,行列确定后,也就得到了PID的值,再将PID传给kill命令,就可以完成功能了。我们再将这个命令组合保存到脚本文件,命名为k,增加可执行权限。只要执行k脚本,就可以完成一系列动作了。是不是很方便呀。