summaryrefslogtreecommitdiff
path: root/sal/osl/unx
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2003-07-02 13:23:07 +0000
committerVladimir Glazounov <vg@openoffice.org>2003-07-02 13:23:07 +0000
commitf6b8704c52249a400a7c41ca468c224480ac9bf4 (patch)
tree156fd580fcc50168f775dd6e45eed02011b722ff /sal/osl/unx
parent49af9676c92f9ac3d4221deca0ba1fdd8529b5b6 (diff)
INTEGRATION: CWS ooo11rc (1.13.4); FILE MERGED
2003/06/30 14:51:26 hro 1.13.4.4: #i15843# Use mkstemp instead of tmpnam 2003/06/30 14:31:00 hro 1.13.4.3: #i15843# Use mkstemp instead of tmpnam 2003/06/30 13:04:04 hro 1.13.4.2: #i15843# Fixed not failsafe implemented dladdr call 2003/06/21 16:12:39 pjanik 1.13.4.1: #i15896#: Change C++ code to C.
Diffstat (limited to 'sal/osl/unx')
-rw-r--r--sal/osl/unx/signal.c151
1 files changed, 90 insertions, 61 deletions
diff --git a/sal/osl/unx/signal.c b/sal/osl/unx/signal.c
index 95d3d6e997a7..7c80f9366da9 100644
--- a/sal/osl/unx/signal.c
+++ b/sal/osl/unx/signal.c
@@ -2,9 +2,9 @@
*
* $RCSfile: signal.c,v $
*
- * $Revision: 1.14 $
+ * $Revision: 1.15 $
*
- * last change: $Author: vg $ $Date: 2003-07-01 14:53:41 $
+ * last change: $Author: vg $ $Date: 2003-07-02 14:23:07 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -324,87 +324,117 @@ static int ReportCrash( int Signal )
#ifdef INCLUDE_BACKTRACE
char szXMLTempNameBuffer[L_tmpnam];
char szStackTempNameBuffer[L_tmpnam];
+
void *stackframes[1024];
int iFrame;
int nFrames = backtrace( stackframes, sizeof(stackframes)/sizeof(stackframes[0]));
- pXMLTempName = tmpnam( szXMLTempNameBuffer );
- pStackTempName = tmpnam( szStackTempNameBuffer );
+ FILE *xmlout, *stackout;
+ int fdxml, fdstk;
- FILE *xmlout = fopen( pXMLTempName, "w" );
- FILE *stackout = fopen( pStackTempName, "w" );
+ strncpy( szXMLTempNameBuffer, P_tmpdir, sizeof(szXMLTempNameBuffer) );
+ strncat( szXMLTempNameBuffer, "crxmlXXXXXX", sizeof(szXMLTempNameBuffer) );
- fprintf( xmlout, "<errormail:Stack type=\"%s\">\n", STACKTYPE );
+ strncpy( szStackTempNameBuffer, P_tmpdir, sizeof(szStackTempNameBuffer) );
+ strncat( szStackTempNameBuffer, "crstkXXXXXX", sizeof(szStackTempNameBuffer) );
- for ( iFrame = 0; iFrame < nFrames; iFrame++ )
- {
- Dl_info dl_info;
+ fdxml = mkstemp(szXMLTempNameBuffer);
+ fdstk = mkstemp(szStackTempNameBuffer);
- /* Don't want to use malloc here */
- char buffer[MAX_PATH_LEN];
- const char *dli_fname = NULL;
- const char *dli_fdir = NULL;
+ xmlout = fdopen( fdxml , "w" );
+ stackout = fdopen( fdstk , "w" );
- memset( &dl_info, 0, sizeof(dl_info) );
- if( dladdr( stackframes[iFrame], &dl_info) )
- {
- dli_fname = strrchr( dl_info.dli_fname, '/' );
- if ( dli_fname )
- {
- ++dli_fname;
- memcpy( buffer, dl_info.dli_fname, dli_fname - dl_info.dli_fname );
- buffer[dli_fname - dl_info.dli_fname] = 0;
- dli_fdir = buffer;
- }
- else
- dli_fname = dl_info.dli_fname;
+ pXMLTempName = szXMLTempNameBuffer;
+ pStackTempName = szStackTempNameBuffer;
- fprintf( stackout, "0x%x:",
- stackframes[iFrame] );
- if ( dl_info.dli_fbase && dl_info.dli_fname )
- {
- fprintf( stackout, " %s + 0x%x",
- dl_info.dli_fname,
- (char*)stackframes[iFrame] - (char*)dl_info.dli_fbase
- );
- }
- else
- fprintf( stackout, " ????????" );
+ if ( xmlout && stackout )
+ {
+ fprintf( xmlout, "<errormail:Stack type=\"%s\">\n", STACKTYPE );
- if ( dl_info.dli_sname && dl_info.dli_saddr )
- fprintf( stackout, " (%s + 0x%x)",
- dl_info.dli_sname,
- (char*)stackframes[iFrame] - (char*)dl_info.dli_saddr
- );
+ for ( iFrame = 0; iFrame < nFrames; iFrame++ )
+ {
+ Dl_info dl_info;
- fprintf( stackout, "\n" );
+ /* Don't want to use malloc here */
+ char buffer[MAX_PATH_LEN];
- fprintf( xmlout, "<errormail:StackInfo pos=\"%d\" ip=\"0x%x\"",
- iFrame,
- stackframes[iFrame]
- );
+ fprintf( stackout, "0x%x:",
+ stackframes[iFrame] );
- if ( dl_info.dli_fbase && dl_info.dli_fname )
- fprintf( xmlout, " rel=\"0x%x\"", (char *)stackframes[iFrame] - (char *)dl_info.dli_fbase );
+ fprintf( xmlout, "<errormail:StackInfo pos=\"%d\" ip=\"0x%x\"",
+ iFrame,
+ stackframes[iFrame]
+ );
- if ( dli_fname )
- fprintf( xmlout, " name=\"%s\"", dli_fname );
+ memset( &dl_info, 0, sizeof(dl_info) );
- if ( dli_fdir )
- fprintf( xmlout, " path=\"%s\"", dli_fdir );
+ /* dladdr may fail */
+ if ( dladdr( stackframes[iFrame], &dl_info) )
+ {
+ const char *dli_fname = NULL;
+ const char *dli_fdir = NULL;
+
+ /* Don't expect that dladdr filled all members of dl_info */
+ dli_fname = dl_info.dli_fname ? strrchr( dl_info.dli_fname, '/' ) : NULL;
+ if ( dli_fname )
+ {
+ ++dli_fname;
+ memcpy( buffer, dl_info.dli_fname, dli_fname - dl_info.dli_fname );
+ buffer[dli_fname - dl_info.dli_fname] = 0;
+ dli_fdir = buffer;
+ }
+ else
+ dli_fname = dl_info.dli_fname;
+
+ if ( dl_info.dli_fbase && dl_info.dli_fname )
+ {
+ fprintf( stackout, " %s + 0x%x",
+ dl_info.dli_fname,
+ (char*)stackframes[iFrame] - (char*)dl_info.dli_fbase
+ );
+
+ fprintf( xmlout, " rel=\"0x%x\"", (char *)stackframes[iFrame] - (char *)dl_info.dli_fbase );
+ if ( dli_fname )
+ fprintf( xmlout, " name=\"%s\"", dli_fname );
+
+ if ( dli_fdir )
+ fprintf( xmlout, " path=\"%s\"", dli_fdir );
+ }
+ else
+ fprintf( stackout, " ????????" );
+
+ if ( dl_info.dli_sname && dl_info.dli_saddr )
+ {
+ fprintf( stackout, " (%s + 0x%x)",
+ dl_info.dli_sname,
+ (char*)stackframes[iFrame] - (char*)dl_info.dli_saddr );
+ fprintf( xmlout, " ordinal=\"%s+0x%x\"",
+ dl_info.dli_sname,
+ (char *)stackframes[iFrame] - (char *)dl_info.dli_saddr );
+ }
- if ( dl_info.dli_sname && dl_info.dli_saddr )
- fprintf( xmlout, " ordinal=\"%s+0x%x\"", dl_info.dli_sname, (char *)stackframes[iFrame] - (char *)dl_info.dli_saddr );
+ }
+ else /* dladdr failed */
+ {
+ fprintf( stackout, " ????????" );
+ }
+ fprintf( stackout, "\n" );
fprintf( xmlout, "/>\n" );
}
+
fprintf( xmlout, "</errormail:Stack>\n" );
- }
- fclose( stackout );
- fclose( xmlout );
+ fclose( stackout );
+ fclose( xmlout );
+ }
+ else
+ {
+ pXMLTempName = NULL;
+ pStackTempName = NULL;
+ }
#if defined( LINUX )
snprintf( szShellCmd, sizeof(szShellCmd)/sizeof(szShellCmd[0]),
@@ -448,11 +478,10 @@ static int ReportCrash( int Signal )
static void PrintStack( int sig )
{
void *buffer[MAX_FRAME_COUNT];
+ int size = backtrace( buffer, sizeof(buffer) / sizeof(buffer[0]) );
fprintf( stderr, "\n\nFatal exception: Signal %d\n", sig );
- int size = backtrace( buffer, sizeof(buffer) / sizeof(buffer[0]) );
-
if ( size > 0 )
{
fputs( "Stack:\n", stderr );