应用程序打印调用栈
定义dump_stack函数如下:
#include <execinfo.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define STR_SIZE 100
#define STACK_MUN 100
void dump_stack()
{
int j, strack_num;
void *strack_buffer[STACK_MUN];
char **symb_string;
strack_num = backtrace(strack_buffer, STR_SIZE);
printf("\n ********* print_trace *********\n");
printf(" There are %d addresses:\n", strack_num);
/* The call backtrace_symbols_fd(strack_buffer, strack_num, STDOUT_FILENO)
* would produce similar output to the following: */
symb_string = backtrace_symbols(strack_buffer, strack_num);
if (symb_string == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < strack_num; j++)
printf("%s\n", symb_string[j]);
free(symb_string);
printf(" ********* print_trace end *********\n\n\n");
}
在代码中调用该函数
static gboolean plugin_init(GstPlugin *plugin)
{
g_print("%s in.\n",__FUNCTION__);
print_trace();
/* FIXME Remember to set the rank if it's an element that is meant
to be autoplugged by decodebin. */
return gst_element_register(plugin, "testvideofilter", GST_RANK_NONE,
GST_TYPE_ZMVIDEOFILTER);
}
输出如下:
plugin_init in.
********* print_trace *********
There are 13 addresses:
/home/plugin-03-Test/bin/libtestvideofilter.so(print_trace+0x2e) [0x7fc12c5a35b6]
/home/plugin-03-Test/bin/libtestvideofilter.so(+0x23df) [0x7fc12c5a43df]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0xb857b) [0x7fc12ddd557b]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0xb9800) [0x7fc12ddd6800]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(gst_plugin_load_file+0x25) [0x7fc12ddd59cb]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0xbe5e8) [0x7fc12dddb5e8]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0xbe9f5) [0x7fc12dddb9f5]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0xbf2f0) [0x7fc12dddc2f0]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0xbf467) [0x7fc12dddc467]
/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(_gst_plugin_loader_client_run+0x21e) [0x7fc12dddaf27]
/libexec/gstreamer-1.0/gst-plugin-scanner(+0xbe5) [0x55a399862be5]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0x7fc12d5f4bf7]
/winstream/libexec/gstreamer-1.0/gst-plugin-scanner(_start+0x2a) [0x55a399862a0a]
********* print_trace end *********
内核空间打印调用栈
内核直接提供了dump_stack函数,头文件linux/kernel.h
dump_stack();
直接调用该函数即可。