Invoking debugger from within a C program
-
21-06-2021 - |
Frage
I am reading the book - "C Interfaces and Implementations" by David Hanson. This exercise questions seems interesting and am unable to find a solution:
On some systems, a program can invoke a debugger on itself when it has detected an error. This facility is particularly useful during development, when assertion failures may be common.
Can you provide a short example on how to invoke a debugger.
void handle_seg_fault(int arg)
{
/* how to invoke debugger from within here */
}
int main()
{
int *ptr = NULL;
signal(SIGSEGV, handle_seg_fault);
/* generate segmentation fault */
*ptr = 1;
}
Lösung
Elaborating on Christian.K's comment, fork()
ing a debugger in the face of something like a SIGFPE or SIGSEGV might not be the best of ideas, because...
- your program is potentially corrupt to begin with, making the
fork()
unsafe; - you might want to use something different for debugging than what the program has hardcoded;
- the average application user does not know how to handle a debugger;
- anyone competent with a debugger will usually prefer the coredump over the auto-invoked debugger.
A coredump that I can copy to a testbed beats a debugger instance at my customer's workplace any time of the day. A debugger interface makes for a lousy end-user error message.
Andere Tipps
I have got this:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
void exception_handler(int)
{
int pid = getpid();
if (fork() != 0) {
while(true) sleep(1000);
}
char buf[20];
sprintf(buf, "--pid=%u", pid);
execlp("gdb", "gdb", buf, NULL);
exit(-1);
}
int init()
{
if (signal(SIGSEGV, exception_handler) < 0) {
return errno;
}
if (signal(SIGILL, exception_handler) < 0) {
return errno;
}
if (signal(SIGFPE, exception_handler) < 0) {
return errno;
}
return 0;
}
int main()
{
if (int rc = init()) {
fprintf(stderr, "init error: %s\n", strerror(rc));
return 1;
}
*((char*)(0)) = 1;
}