【问题标题】:Print stack pointer vs backtrace() printout打印堆栈指针与 backtrace() 打印输出
【发布时间】:2017-10-01 07:08:59
【问题描述】:

我按照this post 中的描述打印了当前堆栈指针

void myFunc1(void)
{
    char *p;
    char b=0x11;
    p = &b;
    printf("printStack(1) [%p]=%d\n",p,*p);
    myfunc2();

}

输出:

printStack(1) [0x7ec8a72f]=17

使用来自backtrace example 的截断代码时的打印输出:

backtrace() returned 4 addresses
/home/lib/libmy1.so(myfunc3+0x14) [0x2aba4378]
/home/lib/libmy1.so(myFunc1+0x220) [0x2aba5d74]
/home/my_demon() [0x1b0b8]
/home/my_demon(main+0x8b8) [0x19668]
/lib/libc.so.6(__libc_start_main+0x118) [0x2ac554c4]

我希望两个打印输出中的地址都在同一个空间地址中。 那么为什么地址 0x7ec8a72f 和 0x2aba4378 有区别呢?

拱门:ARM

谢谢

【问题讨论】:

  • 您是否在同一个程序执行中进行printf()backtrace 调用?
  • 为什么函数的可执行代码会位于当前运行线程的堆栈中?
  • 两个调用('printf()' 和 'backtrace')在同一个程序执行中完成。 @AndrewHenle - 你的意思是stacktrac打印的地址是数据段地址吗?
  • @joni backtrace 正在打印存储在堆栈的返回地址。您的 printf 正在打印指向堆栈位置的指针。它们是完全分开的。
  • 未定义的行为:%p 需要 ptr-to-void,但您传递的是 char *

标签: c linux stack


【解决方案1】:

正如 cmets 中所提到的(作者 Andrew Henle 和 Ian Abbott)。 printf 输出是内存中堆栈位置的地址,而 backtrace 打印存储在堆栈中的被调用函数的返回地址。 谢谢

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 2018-10-30
    • 2016-04-11
    • 2015-07-27
    • 2020-07-27
    • 2011-09-17
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多