Tag: 堆栈

如何使用gdb来探索堆栈/堆?

有谁能请给我一个快速概述/指向我检查C程序的堆栈(和堆?)的方法的文档? 我认为这应该用GDB来完成,但是如果还有其他更直接的选择,那么这应该没问题。 谢谢。

是否有一种编程方式来检查堆栈损坏

我正在使用multithreading嵌入式应用程序。 每个线程都根据其function分配堆栈大小。 最近我们发现其中一个线程通过定义一个超过堆栈大小的局部变量数组来破坏堆栈。 操作系统是uItron。 我的解决方案,我注册了10 mS的计时器,这个计时器将检查堆栈损坏。 堆栈损坏检查方法,1。用一些独特的模式初始化堆栈内存(我使用0x5A5A5A5A)2。检查堆栈内存顶部是否仍然是0x5A5A5A5A 我的问题, 有没有更好的方法来检查这种类型的腐败 忘了添加,立即添加:操作系统:Itron,处理器:ARM9。 编译器:不是GCC(特定于ARM9由处理器供应商提供)……并且没有内置支持堆栈检查…

x86_64对齐堆栈并在不保存寄存器的情况下恢复

我正在为x86_64编写中断处理例程。 ABI指定在调用C函数之前,我必须将堆栈对齐到16个字节。 x86_64 ISA指定在进入ISR时,我的堆栈是8字节对齐的。 我需要将我的堆栈指针对齐到16个字节。 问题是从我的C函数返回时,我必须恢复(可能)未对齐的堆栈指针,以便我可以正确地从我的中断返回。 我想知道是否有办法在不使用通用寄存器的情况下执行此操作?

数组的元素是否保证从较低地址存储到较高地址?

假设我有以下数组: int list[3]={2,8,9}; printf(“%p,%p,%p”,(void*)&list[0],(void*)&list[1],(void*)&list[2]); 是否始终保证&list [0] <&list [1] <&list [2] ? 我曾经认为使用C时它是一个严格而快速的规则,但现在必须非常肯定它作为一个OP只是在我回答关于endianness问题时问我这个问题 小端或大端 让我第二个想法的是stacks can grow up or down我不是很确定,所以你的严谨答案是值得赞赏的。谢谢。

C程序找到堆栈增长的方向

如何在C中找到堆栈正向或反向进展? 这项工作? int j = 0; int k = 0; if (&k > &j) printf (“Stack is growing in forward direction”); else if (&k < &j) printf ("Stack is growing in reverse direction");

初学者对x86堆栈的困惑

首先,我想知道这个模型是否是堆栈“框架”过程的准确表示。 我被告知,从概念上讲,堆栈就像一个可乐瓶。 糖在底部,你把它填满了顶部。 考虑到这一点,如果EIP在另一个瓶子中(它在代码段,而不是堆栈段),Call如何告诉EIP寄存器“定位”被调用的函数? 我在YouTube上观看了一段video,称“RAM的代码段”(保存function的地方)是EIP寄存器所在的位置。

x86调用约定:堆栈传递的参数应该是只读的吗?

似乎最先进的编译器将堆栈传递的参数视为只读。 请注意,在x86调用约定中,调用者将参数压入堆栈,并且被调用者使用堆栈中的参数。 例如,以下C代码: extern int goo(int *x); int foo(int x, int y) { goo(&x); return x; } 由OS X 10.10中的clang -O3 -c gc -S -m32编译成: .section __TEXT,__text,regular,pure_instructions .macosx_version_min 10, 10 .globl _foo .align 4, 0x90 _foo: ## @foo ## BB#0: pushl %ebp movl %esp, %ebp subl $8, %esp movl 8(%ebp), %eax movl %eax, -4(%ebp) leal […]

区别 – 从函数返回’local’char *与从函数返回’local’int *

可能重复: 可以在其范围之外访问局部变量的内存吗? 这是一个简单的代码,其中3个不同的函数[localStrPtr,localIntPtr,localCharPtr ]在它们各自的函数中返回指向它们的局部变量[string,integer,char]的指针。 码: #include char* localStrPtr (char*); int* localIntPtr (int, int); char* localCharPtr (char); main() { int *pInt; char *pChar; printf( “localStrPtr = %s\n”, localStrPtr(“abcd”) ); pInt = (int*) localIntPtr(3, 5); printf( “localIntPtr = %d\n”, *pInt ); pChar = (char*) localCharPtr(‘y’); printf( “localCharPtr = %c\n”, *pChar ); } char* localStrPtr(char* argu) { char […]

C语言中的标识符存储在哪里

只是感兴趣。 我正在修改我长期被遗忘的生锈的C知识,我想知道在哪里存储声明变量的标识符? 例如,如果我在main中声明以下char值1。 int main(){ char value1 = ‘A’; return 0; } 我知道char将被存储在堆栈框架中的堆栈中。 让我们说如果我们在value1上做了一个关于这个和value1的地址。 我们会得到像0xF37012(一个假设的数字)。 这将是值所在的位置,但标识符呢? 这与0xF37012有什么关联? 是否在主要的某个地方的堆栈frane? 或者所有标识符都存储在某个全局表或列表中?

为什么在这个函数序言中没有“sub rsp”指令,为什么函数参数存储在负rbp偏移量?

这就是我通过阅读一些内存分段文档所理解的:当一个函数被调用时,有一些指令(称为函数序言)将帧指针保存在堆栈上,将堆栈指针的值复制到基指针中并保存一些局部变量的内存。 这是我尝试使用GDB调试的一个简单代码: void test_function(int a, int b, int c, int d) { int flag; char buffer[10]; flag = 31337; buffer[0] = ‘A’; } int main() { test_function(1, 2, 3, 4); } 调试此代码的目的是了解调用函数时堆栈中发生的情况:因此我必须在执行程序的各个步骤(在调用函数之前和执行期间)检查内存。 虽然我通过检查基指针设法看到返回地址和保存的帧指针之类的东西,但我真的无法理解在反汇编代码之后我要写的内容。 拆解: (gdb) disassemble main Dump of assembler code for function main: 0x0000000000400509 : push rbp 0x000000000040050a : mov rbp,rsp 0x000000000040050d : mov […]