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
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容