[ Ah, I'm too lazy resubscribe with this new address :) ]
On Fri, 29 May 1998, George wrote:
> >Is there a way to find out what function the program was in when a signal
> >is trapped, and then log the name (using Linux) ? I want to find out
> If you have glibc 2 (libc5 doesn't seem to have it), there is a structure
> called 'sigcontext' that will save the 'eip' that the program was currently
> at. Then in gdb, to see the code at that address:
>
> list *0x[address]
>
> I don't know of a way to automate that, and actually, don't see any
> functions in the header to actually use sigcontext. But it's there. If you
> find out more, let me know.
This is how to make it work on libc5 (note, I have not tested this
myself):
Subject: Re: Saved Context Access in exception handler
From: seyko@p5.f434.n5020.z2.fidonet.org (Sergey Korshunoff)
Date: 1998/05/25
Message-ID: <6kbj60$2kr@p5.f434.n5020.z2.fidonet.org>
Newsgroups: comp.os.linux.development.apps
[More Headers]
[Subscribe to comp.os.linux.development.apps]
[LINK]
nextsoft@ist.cerist.dz wrote:
: Well, I would like to know how can I get the saved context (registers, ip,
: stack pointer, ...) in the SIGSEGV exception handler when the exception is
: generated ( for the Intel-386 based Linux). Example:
: void sig_handler ( int s )
: {
: /* I modify here the Instruction Pointer Register */
: /* so I can continue the program execution*/
: }
: int main()
: {
: signal(SIGSEGV, sig_handler);
: int* p=NULL;
: *p=1;
: }
: I thank in advance for your suggestions and help.
Look at the example. It works for libc v5.x.x and for glibc (libc v6.0.x)
Regards,
Sergey Korshunoff
== begin ===================================================================
#include <stdio.h> /* fprintf() */
#include <unistd.h> /* _exit() */
#include <string.h> /* strsignal() */
#include <signal.h> /* signal(), sigcontext */
# if defined( _LINUX_C_LIB_VERSION_MAJOR ) && _LINUX_C_LIB_VERSION_MAJOR==5
# include <asm/sigcontext.h> /* sigcontext (for libc 5.x.x) */
# define sigcontext sigcontext_struct
# endif
void sig_handler ( int signum, struct sigcontext info )
{
if( signum == SIGSEGV )
{
fprintf( stderr,
"Fatal error: segmentation violation accessing %p\n"
" caused by code at %p\n",
(void *)info.cr2, (void *)info.eip );
}
fprintf( stderr,
"Program terminated by signal `%d' (%s)\n",
signum, strsignal(signum));
_exit( -1 );
}
int main()
{
signal(SIGSEGV, (void (*)(int))sig_handler ); /* sigaction() is better */
int* p= (int *)0x10;
*p=1;
return 0;
}
=============================================================================
<erwin@andreasen.com> Herlev, Denmark UNIX System Programmer
<URL:http://www.abandoned.org/drylock/> <*> (not speaking for) DDE
=============================================================================
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST