might need to configure your system to find this library. On our example PowerPC system, we added the path /usr/local/lib to the /etc/ld.so.conf file and invoked the ldconfig utility to update the library search cache.

The last step in preparation is to set an environment variable that the dmalloc library uses to determine the level of debugging that will be enabled. The environment variable contains a debug bit mask that concatenates a number of features into a single convenient variable. Yours might look something like this:

DMALLOC_OPTIONS=debug=0x4f4ed03,inter=100,log=dmalloc.log

Here, debug is the debug-level bit mask, and inter sets an interval count at which the dmalloc library performs extensive checks on itself and the heap. The dmalloc library writes its log output to the file indicated by the log variable.

The dmalloc package comes with a utility to generate the DMALLOC_OPTIONS environment variable based on flags passed to it. The previous example was generated with the following dmalloc invocation. The documentation in the dmalloc package details this quite thoroughly, so we shall not reproduce that here.

$ dmalloc -p check-fence -l dmalloc.log -i 100 high

When these steps are complete, you should be able to run your application against the dmalloc debug library.

dmalloc produces a quite detailed output log. Listing 13-13 reproduces a sample dmalloc log output for an example program that intentionally generates some memory leaks.

Listing 13-13. dmalloc Log Output

2592: 4002: Dmalloc version '5.4.2' from 'http://dmalloc.com/'

2592: 4002: flags = 0x4f4e503, logfile 'dmalloc.log'

2592: 4002: interval = 100, addr = 0, seen # = 0, limit = 0

2592: 4002: starting time = 2592

2592: 4002: process pid = 442

2592: 4002: Dumping Chunk Statistics:

2592: 4002: basic-block 4096 bytes, alignment 8 bytes

2592: 4002: heap address range: 0x30015000 to 0x3004f000, 237568 bytes

2592: 4002:     user blocks: 18 blocks, 73652  bytes (38%)

2592: 4002:    admin blocks: 29 blocks, 118784 bytes (61%)

2592: 4002:    total blocks: 47 blocks, 192512 bytes

2592: 4002: heap checked 41

2592: 4002: alloc calls: malloc 2003, calloc 0, realloc 0, free 1999

2592: 4002: alloc calls: recalloc 0, memalign 0, valloc 0

2592: 4002: alloc calls: new 0, delete 0

2592: 4002:   current memory in use: 52 bytes (4 pnts)

2592: 4002:  total memory allocated: 27546 bytes (2003 pnts)

2592: 4002:  max in use at one time: 27546 bytes (2003 pnts)

2592: 4002: max alloced with 1 call: 376 bytes

2592: 4002: max unused memory space: 37542 bytes (57%)

2592: 4002: top 10 allocations:

2592: 4002:  total-size  count in-use-size  count  source

2592: 4002:       16000   1000          32      2  mtest_ex.c:36

2592: 4002:       10890   1000          20      2  mtest_ex.c:74

2592: 4002:         256      1           0      0  mtest_ex.c:154

2592: 4002:       27146   2001          52      4  Total of 3

2592: 4002: Dumping Not-Freed Pointers Changed Since Start:

2592: 4002:  not freed: '0x300204e8|s1' (10 bytes) from 'mtest_ex.c:74'

2592: 4002:  not freed: '0x30020588|s1' (16 bytes) from 'mtest_ex.c:36'

2592: 4002:  not freed: '0x30020688|s1' (16 bytes) from 'mtest_ex.c:36'

2592: 4002:  not freed: '0x300208a8|s1' (10 bytes) from 'mtest_ex.c:74'

2592: 4002:  total-size  count  source

2592: 4002:          32      2  mtest_ex.c:36

2592: 4002:          20      2  mtest_ex.c:74

2592: 4002:          52      4  Total of 2

2592: 4002: ending time = 2592, elapsed since start = 0:00:00

It is important to note that this log is generated upon program exit. (dmalloc has many options and modes of operation; it is possible to configure dmalloc to print output lines when errors are detected.)

The first half of the output log reports high-level statistics about the heap and the overall memory usage of the application. Totals are produced for each of the malloc library calls, such as malloc(), free(), and realloc(). Interestingly, this default log reports on the top 10 allocations and the source location where they occurred. This can be very useful for overall system-level profiling.

Toward the end of the log, we see evidence of memory leaks in our application. You can see that the dmalloc library detected four instances of memory that was allocated that was apparently never freed. Because we included dmalloc.h and compiled with debug symbols, the source location where the memory was allocated is indicated in the log.

As with the other tools we've covered in this chapter, space permits only a brief introduction of this very powerful debug tool. dmalloc can detect many other conditions and limits. For example, dmalloc can detect when a freed pointer has been written. It can tell whether a pointer was used to access data outside its bounds but within the application's permissible address range. In fact, dmalloc can be configured to log almost any memory transaction through the malloc family of calls. dmalloc is a tool that is sure to pay back many times the effort taken to become proficient with it.

13.4.8. Kernel Oops

Although not strictly a tool, a kernel oops contains much useful information to help you troubleshoot the cause. A kernel oops results from a variety of kernel errors from simple memory errors produced by a process (fully recoverable, in most cases) to a hard kernel panic. Recent Linux kernels support display of symbolic information in addition to the raw hexadecimal address values. Listing 13-14 reproduces a kernel oops from a PowerPC target.

Listing 13-14. Kernel Oops

$ modprobe loop

Oops: kernel access of bad area, sig: 11 [#1]

NIP: C000D058 LR: C0085650 SP: C7787E80 REGS: c7787dd0 TRAP: 0300 Not tainted

MSR: 00009032 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11

DAR: 00000000, DSISR: 22000000

TASK = c7d187b0[323] 'modprobe' THREAD: c7786000

Last syscall: 128

GPR00: 0000006C C7787E80 C7D187B0 00000000 C7CD25CC FFFFFFFF 00000000 80808081

GPR08: 00000001 C034AD80 C036D41C C034AD80 C0335AB0 1001E3C0 00000000 00000000

GPR16: 00000000 00000000 00000000 100170D8 100013E0 C9040000 C903DFD8 C9040000

GPR24: 00000000 C9040000 C9040000 00000940 C778A000 C7CD25C0 C7CD25C0 C7CD25CC

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату