Gimp/app/core/gimpbacktrace.h
Ell 536fc332e0 app: add GimpBacktrace
GimpBacktrace provides an interface for creating and traversing
multi-threaded backtraces, as well as querying symbol information.
While we already have some backtrace functionality, it relies on
external tools for the most part, and as such is rather expensive,
and is only meant for producing opaque backtraces.  GimpBacktrace,
on the other hand, is meant to be relatively cheap (we're going to
use it for profiling,) and allow inspection of the backtrace data.
In the future, it might make sense to replace some, or all, of the
other backtrace functions with GimpBacktrace.

GimpBacktrace currently only supports Linux.  By default, it uses
dladdr() to query symbol information, which is somewhat limited (in
particular, it doesn't work for static functions.)  When libunwind
is installed, GimpBacktrace uses it to get more complete symbol
information.  libunwind is currently an optional dependency, but it
might make sense to promote it to a mandatory, or opt-out,
dependency, as it's lightweight and widely available.

On other platforms, the GimpBacktrace interface can still be used,
but it always returns NULL backtraces.

(cherry picked from commit 80bf686c94)
2018-09-02 03:24:51 -04:00

62 lines
2.6 KiB
C

/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpbacktrace.h
* Copyright (C) 2018 Ell
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_BACKTRACE_H__
#define __GIMP_BACKTRACE_H__
typedef struct _GimpBacktraceSymbolInfo GimpBacktraceSymbolInfo;
struct _GimpBacktraceSymbolInfo
{
gchar object_name[256];
gchar symbol_name[256];
guintptr symbol_address;
};
gboolean gimp_backtrace_init (void);
void gimp_backtrace_shutdown (void);
GimpBacktrace * gimp_backtrace_new (gboolean include_current_thread);
void gimp_backtrace_free (GimpBacktrace *backtrace);
gint gimp_backtrace_get_n_threads (GimpBacktrace *backtrace);
guintptr gimp_backtrace_get_thread_id (GimpBacktrace *backtrace,
gint thread);
const gchar * gimp_backtrace_get_thread_name (GimpBacktrace *backtrace,
gint thread);
gint gimp_backtrace_find_thread_by_id (GimpBacktrace *backtrace,
guintptr thread_id,
gint thread_hint);
gint gimp_backtrace_get_n_frames (GimpBacktrace *backtrace,
gint thread);
guintptr gimp_backtrace_get_frame_address (GimpBacktrace *backtrace,
gint thread,
gint frame);
gboolean gimp_backtrace_get_symbol_info (guintptr address,
GimpBacktraceSymbolInfo *info);
#endif /* __GIMP_BACKTRACE_H__ */