如何在linux,windows下进行内存泄漏的测试

cwj007 2003-10-28 08:20:34
现在的内存测试,可以定位到内存变化的情况,然后由程序员进行跟踪,是否我们测试组可以在linux下就可以观察到内存对象的变化情况,从而达到直接定位问题,是否有工具支持,请大家多多发言
...全文
155 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengpan_panpan 2004-01-09
  • 打赏
  • 举报
回复
文件命名成memleak.c

编译cc -o memleak memleak.c -ldl

运行前首先设置环境变量MALLOC_TRACE
比如export MALLOC_TRACE=log
然后memleak 程序 程序参数
运行完成后得到文件log
然后mtrace log,mtrace在老版本的glibc里面自带,/usr/bin/mtrace
要是没有就去rpmfind.net或者gnu.org找。
zengpan_panpan 2004-01-09
  • 打赏
  • 举报
回复
正好写了个linux版的。
限制是只能测试动态连接的程序。(一般静态连接的都很少)
不需要程序带符号表。就是说,没有源代码也行。

#include <linux/unistd.h>
#include <linux/limits.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/user.h>
#include <unistd.h>
#include <signal.h>
#include <link.h>
#include <dlfcn.h>

int main(int argc, char *argv[], char *envp[])
{
int status;
pid_t pid;
struct link_map *l = (struct link_map *)dlopen("libc.so.6", RTLD_LAZY);
char *p_mtrace = (char *)dlsym(l, "mtrace");
char *p_muntrace = (char *)dlsym(l, "muntrace");
char *p_atexit = (char *)dlsym(l, "atexit");
char *l_map_start = (char *)l->l_addr;
long f_mtrace = p_mtrace - l_map_start;
long f_muntrace = p_muntrace - l_map_start;
long f_atexit;
if (p_atexit == NULL)
p_atexit = (char *)dlsym(l, "on_exit");
f_atexit = p_atexit - l_map_start;
dlclose(l);

if (pid = fork())
{
int libc_fd;
long o1, o2, o3, o4, o5, n1, n2, n3, n4, n5;

struct user u;
struct user_regs_struct regs;
wait(&status);
ptrace(PTRACE_SYSCALL, pid, 0, 0);
wait(&status);
while (WSTOPSIG(status) == SIGTRAP)
{
ptrace(PTRACE_GETREGS, pid, 0, ®s);
if (regs.orig_eax == __NR_open)
{
char buf[PATH_MAX];
char *p = buf;
for ( ;p - buf < PATH_MAX; p += 4, regs.ebx += 4)
{
*(long *)p = ptrace(PTRACE_PEEKDATA, pid, regs.ebx, 0);
if (!p[0] || !p[1] || !p[2] || !p[3])
break;
}
ptrace(PTRACE_SYSCALL, pid, 0, 0);
wait(&status);
if (strstr(buf, "libc.so.6"))
{
ptrace(PTRACE_GETREGS, pid, 0, ®s);
libc_fd = regs.eax;
break;
}
}
ptrace(PTRACE_SYSCALL, pid, 0, 0);
wait(&status);
}

while (WSTOPSIG(status) == SIGTRAP)
{
ptrace(PTRACE_GETREGS, pid, 0, ®s);
if (regs.orig_eax == __NR_mmap || regs.orig_eax == __NR_mmap2)
{
ptrace(PTRACE_SYSCALL, pid, 0, 0);
wait(&status);
if (ptrace(PTRACE_PEEKDATA, pid, regs.ebx + 16, 0) == libc_fd)
{
ptrace(PTRACE_GETREGS, pid, 0, ®s);
if (l_map_start)
{
f_mtrace += regs.eax;
f_muntrace += regs.eax;
f_atexit += regs.eax;
}
break;
}
}
ptrace(PTRACE_SYSCALL, pid, 0, 0);
wait(&status);
}

while (WSTOPSIG(status) == SIGTRAP)
{
ptrace(PTRACE_GETREGS, pid, 0, ®s);
switch (ptrace(PTRACE_PEEKDATA, pid, regs.eip, 0))
{
case 0xe850d1ff:
if (ptrace(PTRACE_PEEKDATA, pid, regs.eip + 4, 0) == 0xfffff863)
goto found;
break;
case 0x830855ff:
if (ptrace(PTRACE_PEEKDATA, pid, regs.eip + 4, 0) == 0xe85014c4)
goto found;
break;
case 0x890855ff:
if (ptrace(PTRACE_PEEKDATA, pid, regs.eip + 4, 0) == 0xb1e82404)
goto found;
break;
}
ptrace(PTRACE_SINGLESTEP, pid, 0, 0);
wait(&status);
}
found:
if (WSTOPSIG(status) == SIGTRAP)
{
ptrace(PTRACE_GETREGS, pid, 0, ®s);
o1 = ptrace(PTRACE_PEEKDATA, pid, regs.eip , 0);
o2 = ptrace(PTRACE_PEEKDATA, pid, regs.eip + 4, 0);
o3 = ptrace(PTRACE_PEEKDATA, pid, regs.eip + 8, 0);
o4 = ptrace(PTRACE_PEEKDATA, pid, regs.eip + 12, 0);
o5 = ptrace(PTRACE_PEEKDATA, pid, regs.eip + 16, 0);
n1 = 0x6890 | (f_muntrace << 16);
n2 = (f_muntrace >> 16) | 0xe80000 | ((f_atexit - (regs.eip + 11)) << 24);
n3 = 0x58000000 | ((f_atexit - (regs.eip + 11)) >> 8);
n4 = 0xe8 | ((f_mtrace - (regs.eip + 17)) << 8);
n5 = 0xcccccc00 | ((f_mtrace - (regs.eip + 17)) >> 24);
ptrace(PTRACE_POKEDATA, pid, regs.eip , n1);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 4, n2);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 8, n3);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 12, n4);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 16, n5);
ptrace(PTRACE_SETREGS, pid, 0, ®s);
ptrace(PTRACE_CONT, pid, 0, 0);
wait (&status);
}

if (WSTOPSIG(status) == SIGTRAP)
{
ptrace(PTRACE_POKEDATA, pid, regs.eip , o1);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 4, o2);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 8, o3);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 12, o4);
ptrace(PTRACE_POKEDATA, pid, regs.eip + 16, o5);
ptrace(PTRACE_SETREGS, pid, 0, ®s);
ptrace(PTRACE_CONT, pid, 0, 0);
wait (&status);
}

} else {
ptrace(PTRACE_TRACEME, 0, 0, 0);
execve(argv[1], &argv[1], envp);
}
return status;
}
大河V5 2004-01-09
  • 打赏
  • 举报
回复
gz
nova2001 2003-12-18
  • 打赏
  • 举报
回复
顶!
cwj007 2003-12-17
  • 打赏
  • 举报
回复
各位同仁,我需要的是长期的行为检查工作,而不是针对某个应用,大家有没有
cnstar9988 2003-12-17
  • 打赏
  • 举报
回复
用purify 2003
happy_man 2003-12-15
  • 打赏
  • 举报
回复
在windows下直接使用任务管理器对进程的内存监测,通过压力数据来测试目标程序是否发生内存泄漏,或者可以采用性能管理器,里面也有相应的内存观察机制
在unix下采用free或则top的方法也可以看到
以上两种都是不用工具的做法,当然,不能够知道在什么地方有内存泄漏,只能够根据一些业务流程来推测

还有,省钱的方法还有一个,就是vc的debug下面可以对内存泄漏情况进行跟踪,但是效果一般

好了,仅供参考
cwj007 2003-12-12
  • 打赏
  • 举报
回复
倒,晕,purify我比较熟,有没有更好的,可以支持
loveisbug 2003-12-03
  • 打赏
  • 举报
回复
windows 下用purify
simman 2003-10-29
  • 打赏
  • 举报
回复
用Rational purify测试工具可以监控与定位

5,179

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 质量管理/软件测试
功能测试压力测试安全性测试 个人社区 湖南省·长沙市
社区管理员
  • 软件测试
  • 虫无涯
  • 小博测试成长之路
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎大家加入到软件测试的社区,在这里,希望大家勇于发表自己的看法,欢迎大家分享自己在软件测试工作过程中遇到的问题以及工作经验分享。

1.想转行的小伙伴,遇到问题没有及时回复的,可以私聊小博进行反馈

2.大家对社区有好的建议,都可以在社区发帖进行反馈

推荐大家学习的软件测试入门笔记:软件测试入门学习笔记

试试用AI创作助手写篇文章吧