2017-05-03 170 views
-1

我打印當前堆棧指針如在this post打印堆棧指針VS回溯()打印輸出

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

} 

outout描述:

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] 

我預計這兩個打印輸出中的地址都是相同的s步調地址。 那麼爲什麼地址0x7ec8a72f與0x2aba4378有差異呢?

拱門:ARM

感謝

+1

你正在執行'printf()'和'backtrace'調用嗎? – filaton

+3

爲什麼函數的可執行代碼位於當前正在運行的線程的堆棧上? –

+0

這兩個調用('printf()'和'backtrace')在相同的程序執行中完成。 @AndrewHenle - 你的意思是stacktrac打印的地址是數據段地址嗎? – joni

回答

0

正如評論(安德魯·漢勒和伊恩·雅培)提及。 printf輸出是內存中堆棧位置的地址,而回溯打印存儲在堆棧中的被調用函數的返回地址。 謝謝