[英]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
get_esp ()
和get_ebp ()
函數( fpC = get_esp ();
其中fpC是一個int) fprintf (stderr, "%x", fcP);
) 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.