本文演示了python通过ctypes调用C/C++ SDK,当SDK异常时,同时打印C/C++/Python的栈信息.基于traceback、addr2line、PyErr_SetString、backtrace_symbols
一.复现步骤
cat > print_backtrace.h <<-'EOF'
#ifndef __PRINT_BACKTRACE_H__
#define __PRINT_BACKTRACE_H__
#ifdef __cplusplus
extern "C" {
#endif
void print_backtrace();
#ifdef __cplusplus
}
#endif
#endif // __PRINT_BACKTRACE_H__
EOF
cat > print_backtrace.cpp <<-'EOF'
#include "print_backtrace.h"
#include <stdio.h>
#include <execinfo.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <stdexcept>
#include <Python.h>
#define MAX_FRAMES 128
#define BUFFER_SIZE 512
void print_backtrace()
{
// 1.打印调用栈
void *buff[MAX_FRAMES] = { 0 };
unsigned int depth = backtrace(buff, MAX_FRAMES);
char **strings = backtrace_symbols(buff, depth);
printf("-----------------------print_backtrace(c/c++)--------------------\n");
for (int i = 0; i < MAX_FRAMES; i++)
{
if (i >= depth)
{
break;
}
// 1.1 将地址转换为代码路径和行号
{
char cmdline[BUFFER_SIZE] = {0};
snprintf(cmdline, BUFFER_SIZE, "bash ./parser.sh \"%s\"", strings[i]);
FILE *pFd = popen(cmdline, "r");
if ( pFd == nullptr )
{
printf("p