yigal
yigal

Reputation: 4725

is there a substitute malloc and free library on solaris?

I am trying to find memory leaks in a very complicated legacy system that is written in C++/C on the Solaris operating system. the idea is to log every malloc and free and then postproccess the log.

i was able to write a stub malloc and free function that gets called correctly. the problem is that they dont do anyhing other than log. As a result the sytem crashes

My question is: is they a substitute malloc library that works on solaris that is can call from my stub malloc& free functions?

Upvotes: 2

Views: 514

Answers (3)

jlliagre
jlliagre

Reputation: 30823

In addition to libumem, I would recommend using Solaris Studio dbx which includes with RTC, a memory leak detector.

Upvotes: 0

trondn
trondn

Reputation: 379

Why don't you just do an LD_PRELOAD of libumem and use UMEM_DEBUG? The manpage for umem_debug should give you more information.

Upvotes: 3

Alok Save
Alok Save

Reputation: 206546

Ideally, You should some memory profiling tool but in the absence of the same you can try to implement your own leak detector as you plan to.

You can just call malloc and free library versions through your wrapper.

Here is a scheme that you may try to implement:

Your wrapper function should implement a functionality wherein your wrapper for malloc stores the line number, file name, size requested & address being returned by malloc in a linked list.
How to get filename and line number?
Hint: Use __FILE__, __LINE__

The free wrapper should check the address being sent for freeing against the list and remove the entry from the linked list.

At the end of the program you should print contents of this linked list which gives you leaking memory size, file name and line number from where the buffer was allocated.

Update:
How do you map program malloc calls to own wrapper calls without infinite recurssion?

Through clever Use of Macros!

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)

void* my_malloc(size_t size, const char *file, int line, const char *func)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);

    /*Link List functionality goes in here*/

    return p;
}

Upvotes: 3

Related Questions