mprotect tiene una desventaja: su memoria debe estar alineada con el límite de página. Tenía mi memoria problemática en la pila y no pude usar mprotect().
Como dijo Adam, lo que quiere es manipular los registros de depuración. En Windows, utilicé esto: http://www.morearty.com/code/breakpoint/ y funcionó muy bien. También lo porté a Mach-O (Mac OS X), y funcionó muy bien también. También fue fácil, porque Mach-O tiene thread_set_state(), que es equivalente a SetThreadContext().
El problema con Linux es que no tiene tales equivalentes. Encontré Ptrace, pero pensé, esto no puede ser, debe haber algo más simple. Pero no hay. Todavía. Creo que están trabajando en una API hw_breakpoint para kernel y espacio de usuario.(Consulte http://lwn.net/Articles/317153/)
Pero cuando encontré esto: http://blogs.oracle.com/nike/entry/memory_debugger_for_linux Lo intenté y no fue tan malo. El método ptrace funciona mediante un "proceso externo" que actúa como un "depurador", adjuntando a su programa, inyectando nuevos valores para los registros de depuración, y terminando con su programa continuando con un nuevo conjunto de puntos de interrupción hw. La cuestión es que puede crear este "proceso externo" usted mismo usando fork(), (no tuve éxito con una subtrama), y haciendo estos simples pasos en línea en su código.
El código addwatchpoint se debe adaptar para trabajar con 64 bit linux, pero eso solo está cambiando USER_DR7 etc. a offsetof (struct user, u_debugreg [7]). Otra cosa es que después de un PTRACE_ATTACH, tiene que esperar a que el depurador realmente se detenga. Pero en lugar de volver a intentar un POKEUSER en un bucle ocupado, lo correcto sería un waitpid() en su pid.
La única pega con el método ptrace es que su programa puede tener solo un "depurador" adjunto a la vez. Por lo tanto, una conexión ptrace fallará si su programa ya se está ejecutando bajo control gdb. Pero al igual que el código de ejemplo, puede registrar un manejador de señal para SIGTRAP, ejecutar sin gdb, y cuando capte la señal, ingrese un bucle ocupado esperando a que se adjunte gdb. Desde allí puedes ver quién intentó escribir tu memoria.
Los registros de depuración solo se pueden acceder al nivel de privilegio 0, es decir, en el núcleo. Ver http://pdos.csail.mit.edu/6.828/2008/readings/i386/s12_02.htm –