C调用栈重温

C栈的地址是从高位地址不断忘低位地址膨胀的,最先调用的函数所处的栈地址最高,后被调用的地址在低位:

A-》H这些地址表明了表明了基本的调用关系,AB是函数入参,CD是函数内的变量。

先调用者在高地址,后调用者在低位地址。

其中参数的顺序是,在左面的参数在低位地址,右面的参数在高位地址,所以如果入参是函数的返回值形式,那么调用顺序应该是先右后左。

而函数中的变量的声明则是先声明的高位地址,后声明的参数在低位地址。

今天看同事发了一个死机问题定位时感觉自己忘得差不多,温习一下,特此记录~

函数代码如下:

#include <iostream>

using namespace std;

#define PRINT_ADDR(a) {cout << #a << ":" << (unsigned int)&a << ";" << "Val:" << a << endl; }

void StackFounctinB ( unsigned int unParamE, unsigned int unParamF )
{
    unsigned int unParamG = 7;
    unsigned int unParamH = 8;
    PRINT_ADDR(unParamE);
    PRINT_ADDR(unParamF);
    PRINT_ADDR(unParamG);
    PRINT_ADDR(unParamH);
}

void StackFounctinA ( unsigned int unParamA, unsigned int unParamB )
{
    unsigned int unParamC = 3;
    unsigned int unParamD = 4;
    PRINT_ADDR(unParamA);
    PRINT_ADDR(unParamB);
    PRINT_ADDR(unParamC);
    PRINT_ADDR(unParamD);
    StackFounctinB ( 5, 6 );
}

int main()
{
    unsigned int unParamMainA = 10;
    unsigned int unParamMainB = 11;
    PRINT_ADDR(unParamMainA);
    PRINT_ADDR(unParamMainB);
    StackFounctinA ( 1, 2 );
    return 0;
}
时间: 2024-10-08 11:11:17

C调用栈重温的相关文章

Android群英传笔记——第八章:Activity与Activity调用栈分析

Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲 Activity的生命周期与工作模式 Activity调用栈管理 一.Activity Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期 1.起源 Activity是用户交互的第一接口,他

转:《链接、装载与库》里的一个错误:关于调用栈

<链接.装载与库>里的一个错误:关于调用栈 按照原文中描述做了一个PPT: 每次执行push指令时,esp都会减4(因为栈是向低地址增长的),每次pop时esp都会加4. 指令:push a 指令:push b 指令: 1.把main方法当前指令的下一条指定地址(即return address))push到栈中. 2.使用call指令调用目标函数体. 指令:将ebp的当前值push到栈中,即saved ebp. 指令:将esp的值赋给ebp,则意味着进入了foo方法的调用栈. 指令:push

打印完整的递归调用栈

之前在写0-1背包问题的递归解法时,想要弄出完整的递归栈.尝试了使用debug工具手工追踪并画出调用栈,发现太麻烦了,又试了一下使用visual studio的code map功能,发现对于递归,它只会显示递归函数不断调用自己,并不会自动展开成为树的形式.所以我就使用了最简陋的办法,就是自己写了一个类,依赖C++的constructor和destructor来自动将栈输入到一个vector中,并且在main函数结束的地方添加一个语句将其内容输出到文件中. 这里使用了一些C++11的特性,我使用m

Python 显示调用栈

Python调试不如强类型的语言方便,显示调用栈有时非常必要,inspect模块很好用 import inspect inspect.stack() inspect.stack()返回的是一个函数栈帧列表如(已经做了一个for e in inspect(): print e 转化) (<frame object at 0x7f6ec27b2050>, '/usr/lib/python2.7/dist-packages/oslo/config/cfg.py', 495, '_is_opt_reg

Android各种获取代码调用栈的方法[补]

打印调用栈不用说,基本上每位开发者都会用到,讨论几个方法,以前也说过,http://blog.csdn.net/freshui/article/details/9456889 再次简单整理一下吧,啰嗦就啰嗦了 :) 基本分两大类,一类是静态的,要把打印语句插入到代码中,一类是动态的,需要看的时候,查看一下,实时观测各线程调用栈情况. 静态方法 1. Java中打印调用栈 比较简单,利用Throwable,直接log中打印出来: [java] view plain copy Log.d(TAG, 

GDB 运行PYTHON 脚本+python 转换GDB调用栈到流程图

http://tromey.com/blog/?cat=17 http://blog.csdn.net/cnsword/article/details/16337031 http://blog.csdn.net/woohello/article/details/7326615 转换GDB调用栈到流程图 http://blog.csdn.net/HorkyChen/article/details/23307921 http://blog.csdn.net/horkychen/article/det

寒假捉虫记——从一段损坏的调用栈开始折腾

放假在家,继续调试<家园>.目前的进度是MinGW上的编译链接都已通过,游戏程序也已经可以跑起来并进入主菜单界面,但加载关卡之后就会闪退.这让我想起了以前上中学时玩盗版游戏的日子.那个年代的单机游戏估计大多是用C/C++写的,一个不小心的内存操作就会让进程崩掉:而且那个年代的操作系统没现在稳定,可能破解技术也不够先进,从电脑城里买来的五六块钱的盗版游戏质量参差不齐.很多游戏跑着跑着就闪退,有的甚至连打都打不开,让人甚为恼火.如今源代码在手,并且我也是程序员了,可以对闪退的原因一探究竟,再也不用

try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就

package com.github.jdk7; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, * finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就丢失了. * * @author doctor * * @since 2014年

在c或c+程序里打印调用栈。转

在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好不过了.本文介绍和调用椎栈相关的几个函数. NAME       backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging SYNOPSIS