Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linux C debugging library to detect memory corruptions [closed]

When working sometimes ago on an embedded system with a simple MMU, I used to program dynamically this MMU to detect memory corruptions.

For instance, at some moment at runtime, the foo variable was overwritten with some unexpected data (probably by a dangling pointer or whatever). So I added the additional debugging code :

  • at init, the memory used by foo was indicated as a forbidden region to the MMU;
  • each time foo was accessed on purpose, access to the region was allowed just before then forbidden just after;
  • a MMU irq handler was added to dump the master and the address responsible of the violation.

This was actually some kind of watchpoint, but directly self-handled by the code itself.

Now, I would like to reuse the same trick, but on a x86 platform. The problem is that I am very far from understanding how is working the MMU on this platform, and how it is used by Linux, but I wonder if any library/tool/system call already exist to deal with this problem.

Note that I am aware that various tools exist like Valgrind or GDB to manage memory problems, but as far as I know, none of these tools car be dynamically reconfigured by the debugged code.

I am mainly interested for user space under Linux, but any info on kernel mode or under Windows is also welcome!

like image 528
calandoa Avatar asked Jan 23 '23 03:01

calandoa


2 Answers

You can use the mmap (MAP_ANONYMOUS) and mprotect functions to manipulate the virtual memory system and use the corresponding protection flags. Your variables need to be constrained to a multiple of the system page size of course. Lots of small variables will present a significant overhead.

Of course your application needs to work correctly when managing access rights to the memory regions. You also need to use mmap() instead of malloc for the protected regions.

This is the user space interface layer to the MMU, in a relatively portable fashion.

mmap and mprotect

like image 97
Yann Ramin Avatar answered Jan 26 '23 00:01

Yann Ramin


Two good options:

  • dmalloc is a library that replaces malloc() and free() with extensive debugging versions, capable of using page boundaries to detect memory overruns/underruns, filling allocated and freed memory, leak-checking, and more.
  • valgrind is a memory debugger that allows very precise memory debugging (detecting accurately any out-of-bounds access) at the expense of program speed (programs run substantially slower under it). It can also do leak checking.
like image 32
Michael Ekstrand Avatar answered Jan 26 '23 00:01

Michael Ekstrand