簡體   English   中英

如何在C程序中打印堆棧的內容?

[英]How can I print the contents of stack in C program?

正如標題所說,我想在我的C程序中打印堆棧的內容。

以下是我采取的步驟:

  • 我做了一個簡單的匯編(helper.s)文件,其中包含一個返回我的ebp寄存器地址的函數和一個返回我的esp寄存器地址的函數

     .globl get_esp get_esp: movl %esp, %eax ret # get_ebp is defined similarly, and included in the .globl section 
  • 我從我的C程序中調用了get_esp ()get_ebp ()函數( fpC = get_esp ();其中fpC是一個int)
  • 我(成功地,我認為)打印了我的esp和ebp寄存器的地址( fprintf (stderr, "%x", fcP);
  • 我嘗試了,但未能打印出我的esp寄存器的內容。 (我嘗試了fprintf (sderr, "%d", *fcP);fprintf (sderr, "%x", *((int *)fcP));以及其他方法)。 處理此行時,我的程序在運行時遇到分段錯誤。

我究竟做錯了什么?

編輯:這必須通過調用這些匯編函數來獲得堆棧指針來完成。 EDIT2:這是家庭作業。

如果您使用GNU系統,您可以使用GNU的C庫擴展來處理回溯,請參見此處

#include <execinfo.h>

int main(void)
{
     //call-a-lot-of-functions
}

void someReallyDeepFunction(void)
{
    int count;
    void *stack[50]; // can hold 50, adjust appropriately
    char **symbols;

    count = backtrace(stack, 50);
    symbols = backtrace_symbols(stack, count);

    for (int i = 0; i < count; i++)
        puts(symbols[i]);

    free(symbols);
}

get_esp返回esp因為它在函數內。 但這與調用函數中的esp ,因為調用操作會改變esp

我建議用一個內聯組件替換該功能。 這樣esp在你嘗試閱讀它時不會改變。

此外,打印到sderr無濟於事。 根據我的經驗, stderr工作得更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM