backtrace

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN 4
#define EXEFILE "a.out"
#define TEXT_BASE 0x400000

int backtrace_m(void **buffer, int size)
{
  int i = 0;
  unsigned int _ebp = 0;
  unsigned int _eip = 0;
  char cmd[size][64];
  __asm__ __volatile__(" \
    movl %%ebp, %0"
    :"=g" (_ebp)
    :
    :"memory"
  );
  unsigned int text_base = TEXT_BASE;
  for(i = 0; i < size; i++) {
    _eip = (unsigned int)((unsigned int*)_ebp + 1);
    _eip = *(unsigned int*)_eip - text_base;
    _ebp = *(unsigned int*)_ebp;
    buffer[i] = (void*)_eip;

    memset(cmd[i], 0, sizeof(cmd[i]));
    sprintf(cmd[i], "addr2line %p -f -e ", buffer[i]);
    strncat(cmd[i], EXEFILE, strlen(EXEFILE));
    system(cmd[i]);
    printf("debug> %s\n",cmd[i]);
  }

  return size;
}

static void test2(void)
{
  int i = 0;
  void *buffer[LEN] = {0};
  backtrace_m(buffer, LEN);
  return;
}

static void test1(void)
{
  test2();
}

static void test(void)
{
  test1();
}

int main(int argc, char *argv[])
{
  test();
  return 0;
}
image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容