Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Watch a memory location/install 'data breakpoint' from code?

We have a memory overwrite problem. At some point, during the course of our program, a memory location is being overwritten and causing our program to crash. the problem happens only in release mode. when in debug, all is well. that is a classic C/C++ bug, and a very hard one to locate.

I wondered if there's a way to add some 'debugging code' that will watch this memory location and will call a callback once its changed. This is basically what a debugger could do in debug mode (a 'data breakpoint') but we need something similar in release.

like image 480
Lior Avatar asked Nov 30 '22 19:11

Lior


2 Answers

If you can control the location of the variable then you can allocate it on a dedicated page and set the permissions of the page to allow reads only using VirtualProtect (on Windows ... not sure for Linux).

This way you will get an access violation when someone tries to write to it. With an exception translator function you could treat this as a callback.

Even if you can't move the variable directly (eg. it is a class member), maybe you could add sufficient padding around the variable to ensure it is on a dedicated page and use the same approach.

like image 124
Rob Walker Avatar answered Dec 04 '22 10:12

Rob Walker


You can still generate debug symbols for a "release" piece of code. This can still be run through a debugger just like you would in "debug" mode.

I recently did something similiar with one of our release drivers so that we could run it through vtune. For the Microsfot LINK, I added the -DEBUG flag, for Microsoft CC I added -Zi. Everything works fine. MSKB link

You might find this link useful.

like image 31
Pod Avatar answered Dec 04 '22 12:12

Pod