configure.ac: Check for getexecname.
* configure.ac: Check for getexecname. * fileline.c: #include <errno.h>. Define getexecname if not available. (fileline_initialize): Try to find the executable in a few different ways. * print.c (error_callback): Only print the filename if it came from the backtrace state. * configure, config.h.in: Rebuild. Co-Authored-By: Gerald Pfeifer <gerald@pfeifer.com> Co-Authored-By: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> From-SVN: r193454
This commit is contained in:
parent
211d71a745
commit
33521509a8
6 changed files with 111 additions and 10 deletions
|
@ -1,3 +1,16 @@
|
||||||
|
2012-11-12 Ian Lance Taylor <iant@google.com>
|
||||||
|
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||||
|
Gerald Pfeifer <gerald@pfeifer.com>
|
||||||
|
|
||||||
|
* configure.ac: Check for getexecname.
|
||||||
|
* fileline.c: #include <errno.h>. Define getexecname if not
|
||||||
|
available.
|
||||||
|
(fileline_initialize): Try to find the executable in a few
|
||||||
|
different ways.
|
||||||
|
* print.c (error_callback): Only print the filename if it came
|
||||||
|
from the backtrace state.
|
||||||
|
* configure, config.h.in: Rebuild.
|
||||||
|
|
||||||
2012-10-29 Ian Lance Taylor <iant@google.com>
|
2012-10-29 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
* mmap.c (backtrace_vector_release): Correct last patch: add
|
* mmap.c (backtrace_vector_release): Correct last patch: add
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
/* Define to 1 if you have the fcntl function */
|
/* Define to 1 if you have the fcntl function */
|
||||||
#undef HAVE_FCNTL
|
#undef HAVE_FCNTL
|
||||||
|
|
||||||
|
/* Define if getexecname is available. */
|
||||||
|
#undef HAVE_GETEXECNAME
|
||||||
|
|
||||||
/* Define if _Unwind_GetIPInfo is available. */
|
/* Define if _Unwind_GetIPInfo is available. */
|
||||||
#undef HAVE_GETIPINFO
|
#undef HAVE_GETIPINFO
|
||||||
|
|
||||||
|
|
21
libbacktrace/configure
vendored
21
libbacktrace/configure
vendored
|
@ -12319,6 +12319,27 @@ cat >>confdefs.h <<_ACEOF
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
# Check for getexecname function.
|
||||||
|
if test -n "${with_target_subdir}"; then
|
||||||
|
case "${host}" in
|
||||||
|
*-*-solaris2*) have_getexecname=yes ;;
|
||||||
|
*) have_getexecname=no ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
ac_fn_c_check_func "$LINENO" "getexecname" "ac_cv_func_getexecname"
|
||||||
|
if test "x$ac_cv_func_getexecname" = x""yes; then :
|
||||||
|
have_getexecname=yes
|
||||||
|
else
|
||||||
|
have_getexecname=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
if test "$have_getexecname" = "yes"; then
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_GETEXECNAME 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests can run" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests can run" >&5
|
||||||
$as_echo_n "checking whether tests can run... " >&6; }
|
$as_echo_n "checking whether tests can run... " >&6; }
|
||||||
if test "${libbacktrace_cv_sys_native+set}" = set; then :
|
if test "${libbacktrace_cv_sys_native+set}" = set; then :
|
||||||
|
|
|
@ -289,6 +289,19 @@ fi
|
||||||
|
|
||||||
AC_CHECK_DECLS(strnlen)
|
AC_CHECK_DECLS(strnlen)
|
||||||
|
|
||||||
|
# Check for getexecname function.
|
||||||
|
if test -n "${with_target_subdir}"; then
|
||||||
|
case "${host}" in
|
||||||
|
*-*-solaris2*) have_getexecname=yes ;;
|
||||||
|
*) have_getexecname=no ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
|
||||||
|
fi
|
||||||
|
if test "$have_getexecname" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
|
||||||
|
fi
|
||||||
|
|
||||||
AC_CACHE_CHECK([whether tests can run],
|
AC_CACHE_CHECK([whether tests can run],
|
||||||
[libbacktrace_cv_sys_native],
|
[libbacktrace_cv_sys_native],
|
||||||
[AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
|
[AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
|
||||||
|
|
|
@ -34,12 +34,17 @@ POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "backtrace.h"
|
#include "backtrace.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
#ifndef HAVE_GETEXECNAME
|
||||||
|
#define getexecname() NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize the fileline information from the executable. Returns 1
|
/* Initialize the fileline information from the executable. Returns 1
|
||||||
on success, 0 on failure. */
|
on success, 0 on failure. */
|
||||||
|
|
||||||
|
@ -49,6 +54,8 @@ fileline_initialize (struct backtrace_state *state,
|
||||||
{
|
{
|
||||||
int failed;
|
int failed;
|
||||||
fileline fileline_fn;
|
fileline fileline_fn;
|
||||||
|
int pass;
|
||||||
|
int called_error_callback;
|
||||||
int descriptor;
|
int descriptor;
|
||||||
|
|
||||||
failed = state->fileline_initialization_failed;
|
failed = state->fileline_initialization_failed;
|
||||||
|
@ -79,12 +86,58 @@ fileline_initialize (struct backtrace_state *state,
|
||||||
|
|
||||||
/* We have not initialized the information. Do it now. */
|
/* We have not initialized the information. Do it now. */
|
||||||
|
|
||||||
if (state->filename != NULL)
|
descriptor = -1;
|
||||||
descriptor = backtrace_open (state->filename, error_callback, data, NULL);
|
called_error_callback = 0;
|
||||||
else
|
for (pass = 0; pass < 4; ++pass)
|
||||||
descriptor = backtrace_open ("/proc/self/exe", error_callback, data, NULL);
|
{
|
||||||
|
const char *filename;
|
||||||
|
int does_not_exist;
|
||||||
|
|
||||||
|
switch (pass)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
filename = state->filename;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
filename = getexecname ();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
filename = "/proc/self/exe";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
filename = "/proc/curproc/file";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filename == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
descriptor = backtrace_open (filename, error_callback, data,
|
||||||
|
&does_not_exist);
|
||||||
|
if (descriptor < 0 && !does_not_exist)
|
||||||
|
{
|
||||||
|
called_error_callback = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (descriptor >= 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (descriptor < 0)
|
if (descriptor < 0)
|
||||||
failed = 1;
|
{
|
||||||
|
if (!called_error_callback)
|
||||||
|
{
|
||||||
|
if (state->filename != NULL)
|
||||||
|
error_callback (data, state->filename, ENOENT);
|
||||||
|
else
|
||||||
|
error_callback (data,
|
||||||
|
"libbacktrace could not find executable to open",
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!failed)
|
if (!failed)
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,12 +69,10 @@ static void
|
||||||
error_callback (void *data, const char *msg, int errnum)
|
error_callback (void *data, const char *msg, int errnum)
|
||||||
{
|
{
|
||||||
struct print_data *pdata = (struct print_data *) data;
|
struct print_data *pdata = (struct print_data *) data;
|
||||||
const char *name;
|
|
||||||
|
|
||||||
name = pdata->state->filename;
|
if (pdata->state->filename != NULL)
|
||||||
if (name == NULL)
|
fprintf (stderr, "%s: ", pdata->state->filename);
|
||||||
name = "/proc/self/exe";
|
fprintf (stderr, "libbacktrace: %s", msg);
|
||||||
fprintf (stderr, "%s: libbacktrace: %s", name, msg);
|
|
||||||
if (errnum > 0)
|
if (errnum > 0)
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
fprintf (stderr, ": %s", strerror (errnum));
|
||||||
fputc ('\n', stderr);
|
fputc ('\n', stderr);
|
||||||
|
|
Loading…
Add table
Reference in a new issue