C/C++内存问题检查利器—Purify (三)
2008-04-02 11:56
351 查看
五、 文件描述符问题
在上面的内存问题表中,对于大多数的内存问题来说,相信对于熟悉C/C++的程序员,并不陌生。有一些关于Watchpoint和文件描述符的内容,可能会让你看得比较模糊,对于Watchpoint,我会在后面讲述。这一节,我就一个示例说一说文件描述述问题是如何产生的,并由此介绍一下Purify的一些特性。 先查看下面这段程序:#include main() { FILE* fp; int num; fp = fopen("./test.txt", "r"); if ( fp == NULL){ perror("Error:"); exit(-1); } fscanf(fp, "%d", &num); if ( num < 0 ){ printf("Error: the num should be greater than 0!/n"); exit(-1); } fclose(fp); } |
由图中,我们可以看到,Purify报告有FIU错误,意思是,我们在程序退出时,没有关闭文件描述符。还有一些算是安全的文件描述符信息,那就是关于0,1,2这三个标准文件描述符的FIU,这些信息是正常的,所以在其前面也就没有小三角符号了。 通过这个例子,我们可以看到,Purify不但可以找到内存的操作错误,还可以找到文件描述符的错误。 如果你不想让Purify显示FIU信息,你可以设置Purify的 -fds-inuse-at-exit=no 选项,如: > purify –fds-inuse-at-exit gcc -g -o testfd testfd.c 或者使用Purify的API函数 purify_clear_fds_inuse 来阻止显示,你可以在你的程序中调用Purify的API函数。有关Purify的API函数的细节,我会在后面给你讲述。
六、 控制Purify的输出
1、产生ASCII文本文件 在默认情况下,Purify会显示出一个图形窗口来报告信息。当然,如果你的环境所限,你不想Purify出现图形界面,只是生成文本文件来报告,能过设置Purify的参数,你可以很容易做到这一点。 在程序编译时,你只需简单的调置Purify的编译参数 –windows=no 即可做到,如: > purify –windows=no gcc –g –o hello hello.c Purify会把其报告信息写到标准错误设备上,在文本方式下,Purify就不报告同种错误出现在个数,而只是报告的信息了。 我们可以使用两种方式让Purify的信息输出到文本文件中。 第一种是使用操作系统的重定向功能,如:在csh下: % a.out.pure >& a.out.messages在sh和ksh下: $ a.out.pure 2> a.out.messages 第二种是指定Purify的日志文件参数,如:-log-file=.plog 下面,是一个Purify生成的ASCII文本文件的样子:> ./hello **** Purify instrumented hello (pid 25698 at Wed Dec 10 22:29:33 2003) * Purify 2003.06.00 Solaris 2 (32-bit) Copyright (C) 1992-2002 Rational Software Corp. All rights reserved. * For contact information type: "purify -help" * Options settings: -follow-child-processes=yes -purify -windows=no / -purify-home=/usr/rational/releases/purify.sol.2003.06.00 / -gcc3_path=/usr/local/bin/gcc / -cache-dir=/usr/rational/releases/purify.sol.2003.06.00/cache / -demangle_program=/usr/local/bin/c++filt * License successfully checked out. * Command-line: ./hello **** Purify instrumented hello (pid 25698) **** ABR: Array bounds read: * This is occurring while in: strlen [rtlib.o] _doprnt [libc.so.1] printf [libc.so.1] main [hello.c:11] _start [crt1.o] * Reading 13 bytes from 0x8ea08 in the heap (1 byte at 0x8ea14 illegal). * Address 0x8ea08 is at the beginning of a malloc'd block of 12 bytes. * This block was allocated from: malloc [rtlib.o] main [hello.c:8] _start [crt1.o] Hello, World **** Purify instrumented hello (pid 25698) **** Current file descriptors in use: 5 FIU: file descriptor 0: FIU: file descriptor 1: FIU: file descriptor 2: FIU: file descriptor 26: FIU: file descriptor 27: **** Purify instrumented hello (pid 25698) **** Purify: Searching for all memory leaks... Memory leaked: 12 bytes (100%); potentially leaked: 0 bytes (0%) MLK: 12 bytes leaked at 0x8ea08 * This memory was allocated from: malloc [rtlib.o] main [hello.c:8] _start [crt1.o] Purify Heap Analysis (combining suppressed and unsuppressed blocks) Blocks Bytes Leaked 1 12 Potentially Leaked 0 0 In-Use 0 0 ---------------------------------------- Total Allocated 1 12 **** Purify instrumented hello (pid 25698) **** * Program exited with status code 13. * 1 access error, 1 total occurrence. * 12 bytes leaked. * 0 bytes potentially leaked. * Basic memory usage (including Purify overhead): 351348 code 101724 data/bss 8192 heap (peak use) 1272 stack * Shared library memory usage (including Purify overhead): 992 libpure_solaris2_init.so.1 (shared code) 280 libpure_solaris2_init.so.1 (private data) 1079516 libc.so.1_pure_p3_c0_111202132_58_32_1158500S (shared code) 31404 libc.so.1_pure_p3_c0_111202132_58_32_1158500S (private data) 2324 libdl.so.1_pure_p3_c0_111202132_58_32_4624S (shared code) 4 libdl.so.1_pure_p3_c0_111202132_58_32_4624S (private data) 14048 libinternal_stubs.so.1 (shared code) 940 libinternal_stubs.so.1 (private data) |
<-上一页 下一页->(版权所有,转载时请注明作者和出处)
相关文章推荐
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (二)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (二)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (四)