Full Descending Stack

Demo:

#define LOG_TAG "QIANG_DEMO_TEST"
#define ATRACE_TAG ATRACE_TAG_ALWAYS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#ifdef __ANDROID__
#include <utils/Log.h>
#include <cutils/trace.h>
#endif

#ifdef __ANDROID__
#define LOGE(fmt, args...) ALOGE(fmt, ##args)
#else
#define LOGE(fmt, args...) printf(fmt, ##args)
#endif

/*===========================================================================
 * FUNCTION   : testBigLittleEndian
 *
 * DESCRIPTION: Function to test Big-Little Endian,
 *                      Litter endian: Low data address stores lower byte, high data address stores higher byte.
 *                      Big endian: Low data address stores higher byte, high data address stores lower byte.
 *                      https://blog.csdn.net/fervor_heart/article/details/8330177
 *
 * PARAMETERS :
 *   @       :
 *
 * RETURN     : Status
 *==========================================================================*/
int testBigLittleEndian() {
  int rc = 0;
  int x = 1;
  LOGE("%s %d \n", __func__, __LINE__);

  if (*(char*) &x ==1) {
    LOGE("Little-Endian. \n");
  } else {
    LOGE("Big-Endian. \n");
  }
  LOGE("%s %d \n", __func__, __LINE__);
  return rc;
}

/*===========================================================================
 * FUNCTION   : testPointerTrans
 *
 * DESCRIPTION: Function to test pointer type translate,
 *                      char* point to 1 byte memory, while int* point to 4 byte memory
 *                      https://blog.csdn.net/fervor_heart/article/details/8330177
 *
 * PARAMETERS :
 *   @       :
 *
 * RETURN     : Status
 *==========================================================================*/
int testPointerTrans() {
  int rc = 0;
  int x = 0x12345678;
  char* p;

  LOGE("%s %d \n", __func__, __LINE__);
  for (int i = 0; i < 4; i++) {
    p = (char*)&x + i;
    LOGE("MEM addr %p [%d] = 0x%x \n", p, i, *p);
  }
  LOGE("%s %d \n", __func__, __LINE__);
  return rc;
}

/*===========================================================================
 * FUNCTION   : testIntRange
 *
 * DESCRIPTION: Function to test int range, int 4 bytes, 32bits
 *                      By default, int was signed and range was -2147483648 ~ 2147483647
 *                      32th bit indicate +/-, 0 for + and 1 for -. See more about complement.
 *                      https://blog.csdn.net/fervor_heart/article/details/13628803
 *
 * PARAMETERS :
 *   @       :
 *
 * RETURN     : Status
 *==========================================================================*/
int testIntRange() {
  int rc = 0;
  int i = 0x7FFFFFFF; //2147483647
  int j = i + 1; //-2147483648
  int k = 0xFFFFFFFF; // -1

  LOGE("%s %d \n", __func__, __LINE__);

  LOGE("i = %d, j = %d, k = %d\n", i, j, k);

  LOGE("%s %d \n", __func__, __LINE__);
  return rc;
}

/*===========================================================================
 * FUNCTION   : testSignedPlusUnsignedInt
 *
 * DESCRIPTION: Function
 *
 * PARAMETERS :
 *   @       :
 *
 * RETURN     : Status
 *==========================================================================*/
int testSignedPlusUnsignedInt() {
  int rc = 0;
  signed int i = -2;
  unsigned int j = 1;

  LOGE("%s %d \n", __func__, __LINE__);

  LOGE("i = %d, j = %d, i + j = %u\n", i, j, i + j);

  LOGE("%s %d \n", __func__, __LINE__);
  return rc;
}

/*===========================================================================
* FUNCTION   : testFullDescendingStack
*
* DESCRIPTION: Function
*
* PARAMETERS :
*   @       :
*
* RETURN     : Status
*==========================================================================*/
int testFullDescendingStack() {
  int rc = 0;
  int i = 0;
  unsigned int k = 0xCCCCEEEE;
  unsigned int szTest_A[10] = {0};
  unsigned int x = 0xBBBBDDDD;
  unsigned int szTest_B[10] = {0};
  unsigned int m = 0xDDDDFFFF;

  //init the array A and array B
  for (i = 0; i < 10; i++) {
    szTest_A[i] = 0xAAAAAAA0 + i;
  }

  for (i = 0; i < 10; i++) {
    szTest_B[i] = 0xBBBBBBB0 + i;
  }

  //display the array A and array B
  for (i = 0; i < 10; i++) {
    LOGE("szTest_A[%d] MEM( %p ) = 0x%x \n", i, &szTest_A[i], szTest_A[i]);
  }

  LOGE("====================================== \n");
  LOGE("k MEM( %p ) = 0x%x, x MEM( %p ) = 0x%x, m MEM( %p ) = 0x%x \n",
    &k, k, &x, x, &m, m);
  LOGE("====================================== \n");

  for (i = 0; i < 10; i++) {
    LOGE("szTest_B[%d] MEM( %p ) = 0x%x \n", i, &szTest_B[i], szTest_B[i]);
  }

  LOGE("====================================== \n");
  for (i = -50; i < 50; i++) {
    LOGE("szTest_B[%d] MEM( %p ) = 0x%x \n", i, &szTest_B[i], szTest_B[i]);
  }
#ifdef __ANDROID__
  sleep(30);
  raise(SIGTRAP);
#endif
  return rc;
}

int main() {
  LOGE("%s %d \n", __func__, __LINE__);
  testBigLittleEndian();
  testPointerTrans();
  testIntRange();
  testSignedPlusUnsignedInt();
  testFullDescendingStack();
  LOGE("%s %d \n", __func__, __LINE__);
  return 0;
}

 

1. Android P ARM 手機上運行結果:

06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: main 177 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testBigLittleEndian 36 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: Little-Endian. 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testBigLittleEndian 43 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testPointerTrans 64 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: MEM addr 0xffd861b4 [0] = 0x78 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: MEM addr 0xffd861b5 [1] = 0x56 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: MEM addr 0xffd861b6 [2] = 0x34 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: MEM addr 0xffd861b7 [3] = 0x12 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testPointerTrans 69 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testIntRange 92 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: i = 2147483647, j = -2147483648, k = -1
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testIntRange 96 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testSignedPlusUnsignedInt 115 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: i = -2, j = 1, i + j = 4294967295
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: testSignedPlusUnsignedInt 119 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[0] MEM( 0xffd86158 ) = 0xaaaaaaa0 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[1] MEM( 0xffd8615c ) = 0xaaaaaaa1 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[2] MEM( 0xffd86160 ) = 0xaaaaaaa2 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[3] MEM( 0xffd86164 ) = 0xaaaaaaa3 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[4] MEM( 0xffd86168 ) = 0xaaaaaaa4 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[5] MEM( 0xffd8616c ) = 0xaaaaaaa5 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[6] MEM( 0xffd86170 ) = 0xaaaaaaa6 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[7] MEM( 0xffd86174 ) = 0xaaaaaaa7 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[8] MEM( 0xffd86178 ) = 0xaaaaaaa8 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_A[9] MEM( 0xffd8617c ) = 0xaaaaaaa9 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: ====================================== 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: k MEM( 0xffd8612c ) = 0xcccceeee, x MEM( 0xffd86128 ) = 0xbbbbdddd, m MEM( 0xffd86124 ) = 0xddddffff 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: ====================================== 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[0] MEM( 0xffd86130 ) = 0xbbbbbbb0 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[1] MEM( 0xffd86134 ) = 0xbbbbbbb1 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[2] MEM( 0xffd86138 ) = 0xbbbbbbb2 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[3] MEM( 0xffd8613c ) = 0xbbbbbbb3 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[4] MEM( 0xffd86140 ) = 0xbbbbbbb4 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[5] MEM( 0xffd86144 ) = 0xbbbbbbb5 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[6] MEM( 0xffd86148 ) = 0xbbbbbbb6 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[7] MEM( 0xffd8614c ) = 0xbbbbbbb7 
06-18 19:29:48.085 25785 25785 E QIANG_DEMO_TEST: szTest_B[8] MEM( 0xffd86150 ) = 0xbbbbbbb8 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[9] MEM( 0xffd86154 ) = 0xbbbbbbb9 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: ====================================== 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-50] MEM( 0xffd86068 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-49] MEM( 0xffd8606c ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-48] MEM( 0xffd86070 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-47] MEM( 0xffd86074 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-46] MEM( 0xffd86078 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-45] MEM( 0xffd8607c ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-44] MEM( 0xffd86080 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-43] MEM( 0xffd86084 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-42] MEM( 0xffd86088 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-41] MEM( 0xffd8608c ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-40] MEM( 0xffd86090 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-39] MEM( 0xffd86094 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-38] MEM( 0xffd86098 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-37] MEM( 0xffd8609c ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-36] MEM( 0xffd860a0 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-35] MEM( 0xffd860a4 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-34] MEM( 0xffd860a8 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-33] MEM( 0xffd860ac ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-32] MEM( 0xffd860b0 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-31] MEM( 0xffd860b4 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-30] MEM( 0xffd860b8 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-29] MEM( 0xffd860bc ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-28] MEM( 0xffd860c0 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-27] MEM( 0xffd860c4 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-26] MEM( 0xffd860c8 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-25] MEM( 0xffd860cc ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-24] MEM( 0xffd860d0 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-23] MEM( 0xffd860d4 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-22] MEM( 0xffd860d8 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-21] MEM( 0xffd860dc ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-20] MEM( 0xffd860e0 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-19] MEM( 0xffd860e4 ) = 0xd3a48a4e 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-18] MEM( 0xffd860e8 ) = 0xffd860cc 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-17] MEM( 0xffd860ec ) = 0xb09ec1e5 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-16] MEM( 0xffd860f0 ) = 0xffffffce 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-15] MEM( 0xffd860f4 ) = 0xffd86130 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-14] MEM( 0xffd860f8 ) = 0xb09ebc05 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-13] MEM( 0xffd860fc ) = 0xfffffff2 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-12] MEM( 0xffd86100 ) = 0xffd860fc 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-11] MEM( 0xffd86104 ) = 0xffd860fc 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-10] MEM( 0xffd86108 ) = 0xbbbbdddd 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-9] MEM( 0xffd8610c ) = 0xffd86124 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-8] MEM( 0xffd86110 ) = 0xddddffff 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-7] MEM( 0xffd86114 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-6] MEM( 0xffd86118 ) = 0xddddffff 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-5] MEM( 0xffd8611c ) = 0xcccceeee 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-4] MEM( 0xffd86120 ) = 0xffd86140 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-3] MEM( 0xffd86124 ) = 0xddddffff 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-2] MEM( 0xffd86128 ) = 0xbbbbdddd 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[-1] MEM( 0xffd8612c ) = 0xcccceeee 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[0] MEM( 0xffd86130 ) = 0xbbbbbbb0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[1] MEM( 0xffd86134 ) = 0xbbbbbbb1 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[2] MEM( 0xffd86138 ) = 0xbbbbbbb2 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[3] MEM( 0xffd8613c ) = 0xbbbbbbb3 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[4] MEM( 0xffd86140 ) = 0xbbbbbbb4 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[5] MEM( 0xffd86144 ) = 0xbbbbbbb5 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[6] MEM( 0xffd86148 ) = 0xbbbbbbb6 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[7] MEM( 0xffd8614c ) = 0xbbbbbbb7 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[8] MEM( 0xffd86150 ) = 0xbbbbbbb8 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[9] MEM( 0xffd86154 ) = 0xbbbbbbb9 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[10] MEM( 0xffd86158 ) = 0xaaaaaaa0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[11] MEM( 0xffd8615c ) = 0xaaaaaaa1 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[12] MEM( 0xffd86160 ) = 0xaaaaaaa2 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[13] MEM( 0xffd86164 ) = 0xaaaaaaa3 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[14] MEM( 0xffd86168 ) = 0xaaaaaaa4 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[15] MEM( 0xffd8616c ) = 0xaaaaaaa5 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[16] MEM( 0xffd86170 ) = 0xaaaaaaa6 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[17] MEM( 0xffd86174 ) = 0xaaaaaaa7 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[18] MEM( 0xffd86178 ) = 0xaaaaaaa8 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[19] MEM( 0xffd8617c ) = 0xaaaaaaa9 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[20] MEM( 0xffd86180 ) = 0xd3a48a4e 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[21] MEM( 0xffd86184 ) = 0xb09ec09c 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[22] MEM( 0xffd86188 ) = 0xffffffff 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[23] MEM( 0xffd8618c ) = 0xb09ec129 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[24] MEM( 0xffd86190 ) = 0xffd861b7 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[25] MEM( 0xffd86194 ) = 0xb09ec205 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[26] MEM( 0xffd86198 ) = 0xb09ec0d9 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[27] MEM( 0xffd8619c ) = 0xb09edfd8 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[28] MEM( 0xffd861a0 ) = 0xb09ec0ac 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[29] MEM( 0xffd861a4 ) = 0xb09ebf29 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[30] MEM( 0xffd861a8 ) = 0x77 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[31] MEM( 0xffd861ac ) = 0xffffffff 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[32] MEM( 0xffd861b0 ) = 0x0 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[33] MEM( 0xffd861b4 ) = 0x12345678 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[34] MEM( 0xffd861b8 ) = 0xd3a48a4e 
06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[35] MEM( 0xffd861bc ) = 0xb09ebded 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[36] MEM( 0xffd861c0 ) = 0xffd86214 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[37] MEM( 0xffd861c4 ) = 0x1 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[38] MEM( 0xffd861c8 ) = 0xffd8621c 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[39] MEM( 0xffd861cc ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[40] MEM( 0xffd861d0 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[41] MEM( 0xffd861d4 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[42] MEM( 0xffd861d8 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[43] MEM( 0xffd861dc ) = 0xea0cf837 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[44] MEM( 0xffd861e0 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[45] MEM( 0xffd861e4 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[46] MEM( 0xffd861e8 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[47] MEM( 0xffd861ec ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[48] MEM( 0xffd861f0 ) = 0x0 
06-18 19:29:48.087 25785 25785 E QIANG_DEMO_TEST: szTest_B[49] MEM( 0xffd861f4 ) = 0xb09eb5d3 

--------- beginning of crash
06-18 19:30:18.090 25785 25785 F libc    : Fatal signal 5 (SIGTRAP), code -6 (SI_TKILL) in tid 25785 (demo_test), pid 25785 (demo_test)
06-18 19:30:18.142 25798 25798 F DEBUG   : Revision: '0'
06-18 19:30:18.142 25798 25798 F DEBUG   : ABI: 'arm'
06-18 19:30:18.142 25798 25798 F DEBUG   : pid: 25785, tid: 25785, name: demo_test  >>> /vendor/bin/hw/demo_test <<<
06-18 19:30:18.142 25798 25798 F DEBUG   : signal 5 (SIGTRAP), code -6 (SI_TKILL), fault addr --------
06-18 19:30:18.142 25798 25798 F DEBUG   :     r0  00000000  r1  000064b9  r2  00000005  r3  ffd8625c
06-18 19:30:18.143 25798 25798 F DEBUG   :     r4  ffd8625c  r5  b09ec1e5  r6  00000032  r7  0000010c
06-18 19:30:18.143 25798 25798 F DEBUG   :     r8  b09ec17f  r9  b09ec09c  r10 ffd86158  r11 ffd8617c
06-18 19:30:18.143 25798 25798 F DEBUG   :     ip  00000030  sp  ffd86100  lr  b09ebd6b  pc  ea08ff04
06-18 19:30:18.144 25798 25798 F DEBUG   : 
06-18 19:30:18.144 25798 25798 F DEBUG   : backtrace:
06-18 19:30:18.144 25798 25798 F DEBUG   :     #00 pc 00061f04  /system/lib/libc.so (tgkill+12)
06-18 19:30:18.144 25798 25798 F DEBUG   :     #01 pc 00000d67  /vendor/bin/hw/demo_test (testFullDescendingStack()+1910)
06-18 19:30:18.144 25798 25798 F DEBUG   :     #02 pc 00000f25  /vendor/bin/hw/demo_test (main+312)
06-18 19:30:18.144 25798 25798 F DEBUG   :     #03 pc 000a1835  /system/lib/libc.so (__libc_init+48)
06-18 19:30:18.145 25798 25798 F DEBUG   :     #04 pc 000005cf  /vendor/bin/hw/demo_test (_start_main+38)
06-18 19:30:18.145 25798 25798 F DEBUG   :     #05 pc 00000016  <unknown>
06-18 19:30:18.158  1371  2070 W NativeCrashListener: Couldn't find ProcessRecord for pid 25785

程序執行到 sleep(30); 的時候,查看 proc 信息:

可以看到 demo_test 可執行文件代碼段位於 內存 b09eb000-b09ed000 和 b09ed000-b09ee000, 其中 demo_test 代碼段的起始地址是 b09eb000。 這個地址很重要,通過 LR 的地址 減去這個起始地址可以得到在這個文件中的相對地址,也就是 addr2line 中用的地址。

b09eb000-b09ed000 r-xp 00000000 103:25 1292                              /vendor/bin/hw/demo_test
b09ed000-b09ee000 r--p 00001000 103:25 1292                              /vendor/bin/hw/demo_test

lr  b09ebd6b , 對應的 demo_test 中的相對地址是 b09ebd6b - b09eb000 = d6b

$ arm-linux-androideabi-addr2line -f -e ./symbols/vendor/bin/hw/demo_test -a d6b
0x00000d6b
_Z23testFullDescendingStackv
hardware/qcom/camera/demo/main.cpp:171
也就是   raise(SIGTRAP); 這一行。

再看下 main 調用 testFullDescendingStack 的時候,將 LR push 到 棧中的地址

06-18 19:29:48.086 25785 25785 E QIANG_DEMO_TEST: szTest_B[29] MEM( 0xffd861a4 ) = 0xb09ebf29

b09ebf29 - b09eb000 = f29

$ arm-linux-androideabi-addr2line -f -e ./symbols/vendor/bin/hw/demo_test -a f29
0x00000f29
main
hardware/qcom/camera/demo/main.cpp:183
也就是 main 函數調用完 testFullDescendingStack,返回後執行的下一條指令地址。

 

同時可以看到 棧空間的內存地址範圍:

ffd66000-ffd87000 rw-p 00000000 00:00 0 [stack]

可以看到函數 中定義的局部變量都是在棧上:

szTest_A[0] MEM( 0xffd86158 ) = 0xaaaaaaa0 
szTest_A[1] MEM( 0xffd8615c ) = 0xaaaaaaa1 
szTest_A[2] MEM( 0xffd86160 ) = 0xaaaaaaa2 
szTest_A[3] MEM( 0xffd86164 ) = 0xaaaaaaa3 
szTest_A[4] MEM( 0xffd86168 ) = 0xaaaaaaa4 
szTest_A[5] MEM( 0xffd8616c ) = 0xaaaaaaa5 
szTest_A[6] MEM( 0xffd86170 ) = 0xaaaaaaa6 
szTest_A[7] MEM( 0xffd86174 ) = 0xaaaaaaa7 
szTest_A[8] MEM( 0xffd86178 ) = 0xaaaaaaa8 
szTest_A[9] MEM( 0xffd8617c ) = 0xaaaaaaa9 
====================================== 
k MEM( 0xffd8612c ) = 0xcccceeee, x MEM( 0xffd86128 ) = 0xbbbbdddd, m MEM( 0xffd86124 ) = 0xddddffff 
====================================== 
szTest_B[0] MEM( 0xffd86130 ) = 0xbbbbbbb0 
szTest_B[1] MEM( 0xffd86134 ) = 0xbbbbbbb1 
szTest_B[2] MEM( 0xffd86138 ) = 0xbbbbbbb2 
szTest_B[3] MEM( 0xffd8613c ) = 0xbbbbbbb3 
szTest_B[4] MEM( 0xffd86140 ) = 0xbbbbbbb4 
szTest_B[5] MEM( 0xffd86144 ) = 0xbbbbbbb5 
szTest_B[6] MEM( 0xffd86148 ) = 0xbbbbbbb6 
szTest_B[7] MEM( 0xffd8614c ) = 0xbbbbbbb7 
szTest_B[8] MEM( 0xffd86150 ) = 0xbbbbbbb8 
szTest_B[9] MEM( 0xffd86154 ) = 0xbbbbbbb9 

int k, x, m; 在棧上的順序符合 滿遞減棧的特點,先定義的 k 在 棧的高地址內存,m 在最低地址內存。(滿遞減棧,向下生長)

a[0] 總是位於 低地址。(貌似是 數組 和 int 變量在棧上的按照類別排序了 ???但是總體符合向下生長的規律),LR 在函數一開始壓棧,因此是 szTest_B[29]

Variable MEM Address  
szTest_A[9] 0xffd8617c 高地址
szTest_A[8] 0xffd86178  
szTest_A[7] 0xffd86174
szTest_A[6] 0xffd86170
szTest_A[5] 0xffd8616c
szTest_A[4] 0xffd86168
szTest_A[3] 0xffd86164
szTest_A[2] 0xffd86160
szTest_A[1] 0xffd8615c
szTest_A[0] 0xffd86158
   
szTest_B[9] 0xffd86154
szTest_B[8] 0xffd86150
szTest_B[7] 0xffd8614c
szTest_B[6] 0xffd86148
szTest_B[5] 0xffd86144
szTest_B[4] 0xffd86140
szTest_B[3] 0xffd8613c
szTest_B[2] 0xffd86138
szTest_B[1] 0xffd86134
szTest_B[0] 0xffd86130
   
k 0xffd8612c
x 0xffd86128
m 0xffd86124 低地址
$ adb shell ps -A |grep -i demo
root         25785  7874    7664   2552 hrtimer_nanosleep ea08f6a4 S demo_test
$ adb shell cat /proc/25785/maps
b09eb000-b09ed000 r-xp 00000000 103:25 1292                              /vendor/bin/hw/demo_test
b09ed000-b09ee000 r--p 00001000 103:25 1292                              /vendor/bin/hw/demo_test
b09ee000-b09ef000 rw-p 00000000 00:00 0 
e9bc9000-e9bce000 r-xp 00000000 fc:00 5474                               /system/lib/libnetd_client.so
e9bce000-e9bcf000 r--p 00004000 fc:00 5474                               /system/lib/libnetd_client.so
e9bcf000-e9bd0000 rw-p 00005000 fc:00 5474                               /system/lib/libnetd_client.so
e9c00000-e9d00000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
e9d02000-e9d05000 r-xp 00000000 fc:00 5610                               /system/lib/libvndksupport.so
e9d05000-e9d06000 r--p 00002000 fc:00 5610                               /system/lib/libvndksupport.so
e9d06000-e9d07000 rw-p 00003000 fc:00 5610                               /system/lib/libvndksupport.so
e9d5a000-e9d71000 r-xp 00000000 fc:00 5433                               /system/lib/liblog.so
e9d71000-e9d72000 r--p 00016000 fc:00 5433                               /system/lib/liblog.so
e9d72000-e9d73000 rw-p 00017000 fc:00 5433                               /system/lib/liblog.so
e9d80000-e9db8000 r-xp 00000000 fc:00 5931                               /system/lib/vndk-sp-28/libunwindstack.so
e9db8000-e9db9000 ---p 00000000 00:00 0 
e9db9000-e9dbd000 r--p 00038000 fc:00 5931                               /system/lib/vndk-sp-28/libunwindstack.so
e9dbd000-e9dbe000 rw-p 0003c000 fc:00 5931                               /system/lib/vndk-sp-28/libunwindstack.so
e9dce000-e9e6b000 r-xp 00000000 fc:00 5344                               /system/lib/libc++.so
e9e6b000-e9e6c000 ---p 00000000 00:00 0 
e9e6c000-e9e71000 r--p 0009d000 fc:00 5344                               /system/lib/libc++.so
e9e71000-e9e72000 rw-p 000a2000 fc:00 5344                               /system/lib/libc++.so
e9e72000-e9e73000 rw-p 00000000 00:00 0                                  [anon:.bss]
e9e98000-e9ead000 r-xp 00000000 fc:00 5915                               /system/lib/vndk-sp-28/libbacktrace.so
e9ead000-e9eae000 r--p 00014000 fc:00 5915                               /system/lib/vndk-sp-28/libbacktrace.so
e9eae000-e9eaf000 rw-p 00015000 fc:00 5915                               /system/lib/vndk-sp-28/libbacktrace.so
e9ee7000-e9f27000 r-xp 00000000 fc:00 5925                               /system/lib/vndk-sp-28/libhidltransport.so
e9f27000-e9f28000 ---p 00000000 00:00 0 
e9f28000-e9f2c000 r--p 00040000 fc:00 5925                               /system/lib/vndk-sp-28/libhidltransport.so
e9f2c000-e9f2d000 rw-p 00044000 fc:00 5925                               /system/lib/vndk-sp-28/libhidltransport.so
e9f50000-e9f76000 r-xp 00000000 fc:00 5929                               /system/lib/vndk-sp-28/liblzma.so
e9f76000-e9f77000 ---p 00000000 00:00 0 
e9f77000-e9f78000 r--p 00026000 fc:00 5929                               /system/lib/vndk-sp-28/liblzma.so
e9f78000-e9f79000 rw-p 00027000 fc:00 5929                               /system/lib/vndk-sp-28/liblzma.so
e9f79000-e9f7f000 rw-p 00000000 00:00 0                                  [anon:.bss]
e9f85000-e9f99000 r-xp 00000000 fc:00 5932                               /system/lib/vndk-sp-28/libutils.so
e9f99000-e9f9a000 ---p 00000000 00:00 0 
e9f9a000-e9f9b000 r--p 00014000 fc:00 5932                               /system/lib/vndk-sp-28/libutils.so
e9f9b000-e9f9c000 rw-p 00015000 fc:00 5932                               /system/lib/vndk-sp-28/libutils.so
e9fd2000-e9ff4000 r-xp 00000000 fc:00 5437                               /system/lib/libm.so
e9ff4000-e9ff5000 r--p 00021000 fc:00 5437                               /system/lib/libm.so
e9ff5000-e9ff6000 rw-p 00022000 fc:00 5437                               /system/lib/libm.so
ea02e000-ea0e5000 r-xp 00000000 fc:00 5345                               /system/lib/libc.so
ea0e5000-ea0e6000 ---p 00000000 00:00 0 
ea0e6000-ea0ea000 r--p 000b7000 fc:00 5345                               /system/lib/libc.so
ea0ea000-ea0ec000 rw-p 000bb000 fc:00 5345                               /system/lib/libc.so
ea0ec000-ea0ed000 rw-p 00000000 00:00 0                                  [anon:.bss]
ea0ed000-ea0ee000 r--p 00000000 00:00 0                                  [anon:.bss]
ea0ee000-ea0f5000 rw-p 00000000 00:00 0                                  [anon:.bss]
ea120000-ea12d000 r-xp 00000000 fc:00 5916                               /system/lib/vndk-sp-28/libbase.so
ea12d000-ea12e000 r--p 0000c000 fc:00 5916                               /system/lib/vndk-sp-28/libbase.so
ea12e000-ea12f000 rw-p 0000d000 fc:00 5916                               /system/lib/vndk-sp-28/libbase.so
ea15c000-ea15d000 r-xp 00000000 fc:00 5369                               /system/lib/libdl.so
ea15d000-ea15e000 r--p 00001000 fc:00 5369                               /system/lib/libdl.so
ea15e000-ea15f000 rw-p 00000000 00:00 0                                  [anon:.bss]
ea1a1000-ea1ac000 r-xp 00000000 fc:00 5923                               /system/lib/vndk-sp-28/libhidlbase.so
ea1ac000-ea1ad000 r--p 0000a000 fc:00 5923                               /system/lib/vndk-sp-28/libhidlbase.so
ea1ad000-ea1ae000 rw-p 0000b000 fc:00 5923                               /system/lib/vndk-sp-28/libhidlbase.so
ea1ca000-ea1d7000 r-xp 00000000 fc:00 5921                               /system/lib/vndk-sp-28/libcutils.so
ea1d7000-ea1d8000 ---p 00000000 00:00 0 
ea1d8000-ea1d9000 r--p 0000d000 fc:00 5921                               /system/lib/vndk-sp-28/libcutils.so
ea1d9000-ea1da000 rw-p 0000e000 fc:00 5921                               /system/lib/vndk-sp-28/libcutils.so
ea227000-ea22c000 r-xp 00000000 fc:00 5933                               /system/lib/vndk-sp-28/libutilscallstack.so
ea22c000-ea22d000 r--p 00004000 fc:00 5933                               /system/lib/vndk-sp-28/libutilscallstack.so
ea22d000-ea22e000 rw-p 00005000 fc:00 5933                               /system/lib/vndk-sp-28/libutilscallstack.so
ea253000-ea2f0000 r-xp 00000000 fc:00 5919                               /system/lib/vndk-sp-28/libc++.so
ea2f0000-ea2f1000 ---p 00000000 00:00 0 
ea2f1000-ea2f6000 r--p 0009d000 fc:00 5919                               /system/lib/vndk-sp-28/libc++.so
ea2f6000-ea2f7000 rw-p 000a2000 fc:00 5919                               /system/lib/vndk-sp-28/libc++.so
ea2f7000-ea2f8000 rw-p 00000000 00:00 0                                  [anon:.bss]
ea309000-ea357000 r-xp 00000000 fc:00 5812                               /system/lib/vndk-28/libbinder.so
ea357000-ea35c000 r--p 0004d000 fc:00 5812                               /system/lib/vndk-28/libbinder.so
ea35c000-ea35d000 rw-p 00052000 fc:00 5812                               /system/lib/vndk-28/libbinder.so
ea385000-ea3a2000 r-xp 00000000 fc:00 5926                               /system/lib/vndk-sp-28/libhwbinder.so
ea3a2000-ea3a3000 r--p 0001d000 fc:00 5926                               /system/lib/vndk-sp-28/libhwbinder.so
ea3a3000-ea3a4000 rw-p 0001e000 fc:00 5926                               /system/lib/vndk-sp-28/libhwbinder.so
ea3a4000-ea3a5000 rw-p 00000000 00:00 0                                  [anon:.bss]
ea3db000-ea3f2000 r-xp 00000000 fc:00 5930                               /system/lib/vndk-sp-28/libunwind.so
ea3f2000-ea3f3000 r--p 00016000 fc:00 5930                               /system/lib/vndk-sp-28/libunwind.so
ea3f3000-ea3f4000 rw-p 00017000 fc:00 5930                               /system/lib/vndk-sp-28/libunwind.so
ea3f4000-ea43a000 rw-p 00000000 00:00 0                                  [anon:.bss]
ea477000-ea478000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea478000-ea479000 rw-p 00000000 00:00 0                                  [anon:linker_alloc]
ea49e000-ea49f000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea4a0000-ea4a1000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea4bf000-ea4c0000 rw-p 00000000 00:00 0                                  [anon:linker_alloc]
ea4db000-ea4fb000 r--s 00000000 00:10 11798                              /dev/__properties__/u:object_r:log_tag_prop:s0
ea4fb000-ea4fc000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea4fc000-ea51c000 r--s 00000000 00:10 11799                              /dev/__properties__/u:object_r:logd_prop:s0
ea51c000-ea53c000 r--s 00000000 00:10 11757                              /dev/__properties__/u:object_r:exported2_default_prop:s0
ea53c000-ea55c000 r--s 00000000 00:10 11917                              /dev/__properties__/properties_serial
ea55c000-ea569000 r--s 00000000 00:10 11694                              /dev/__properties__/property_info
ea569000-ea56a000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea56a000-ea56b000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea56b000-ea56c000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea56c000-ea56d000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea56d000-ea56e000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_lob]
ea56e000-ea570000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea571000-ea572000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea572000-ea573000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea574000-ea575000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea576000-ea577000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea578000-ea579000 r--p 00000000 00:00 0                                  [anon:atexit handlers]
ea579000-ea57b000 rw-p 00000000 00:00 0                                  [anon:System property context nodes]
ea57b000-ea57d000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_lob]
ea57d000-ea57e000 rw-p 00000000 00:00 0                                  [anon:arc4random data]
ea57e000-ea580000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea580000-ea581000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea581000-ea582000 rw-p 00000000 00:00 0                                  [anon:linker_alloc]
ea582000-ea584000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea584000-ea585000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea585000-ea5a5000 r--s 00000000 00:10 11767                              /dev/__properties__/u:object_r:exported_default_prop:s0
ea5a5000-ea5a6000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea5a6000-ea5c6000 r--s 00000000 00:10 11744                              /dev/__properties__/u:object_r:debug_prop:s0
ea5c6000-ea5c7000 ---p 00000000 00:00 0 
ea5c7000-ea5c8000 rw-p 00000000 00:00 0 
ea5c8000-ea5c9000 ---p 00000000 00:00 0 
ea5c9000-ea5e9000 r--s 00000000 00:10 11917                              /dev/__properties__/properties_serial
ea5e9000-ea5eb000 rw-p 00000000 00:00 0                                  [anon:System property context nodes]
ea5eb000-ea5f8000 r--s 00000000 00:10 11694                              /dev/__properties__/property_info
ea5f8000-ea5f9000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea5f9000-ea5fa000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
ea5fa000-ea5fb000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea5fb000-ea5fc000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
ea5fc000-ea5fd000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_small_objects]
ea5fd000-ea5fe000 r--p 00000000 00:00 0                                  [anon:atexit handlers]
ea5fe000-ea5ff000 ---p 00000000 00:00 0                                  [anon:thread signal stack guard]
ea5ff000-ea603000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
ea603000-ea604000 ---p 00000000 00:00 0                                  [anon:bionic TLS guard]
ea604000-ea607000 rw-p 00000000 00:00 0                                  [anon:bionic TLS]
ea607000-ea608000 ---p 00000000 00:00 0                                  [anon:bionic TLS guard]
ea608000-ea6db000 r-xp 00000000 fc:00 458                                /system/bin/linker
ea6db000-ea6dc000 rw-p 00000000 00:00 0                                  [anon:arc4random data]
ea6dc000-ea6e2000 r--p 000d3000 fc:00 458                                /system/bin/linker
ea6e2000-ea6e3000 rw-p 000d9000 fc:00 458                                /system/bin/linker
ea6e3000-ea6e5000 rw-p 00000000 00:00 0 
ea6e5000-ea6e6000 r--p 00000000 00:00 0 
ea6e6000-ea6ec000 rw-p 00000000 00:00 0 
ffd66000-ffd87000 rw-p 00000000 00:00 0                                  [stack]
ffff0000-ffff1000 r-xp 00000000 00:00 0                                  [vectors]

如果對上面的程序簡單修改一下,讓數組 A使用的時候越界,將會導致 LR 在棧中的內容被覆蓋,發生 crash

diff --git a/demo/main.cpp b/demo/main.cpp
index f4d91d9ce..2a43f2b15 100755
--- a/demo/main.cpp
+++ b/demo/main.cpp
@@ -140,7 +140,7 @@ int testFullDescendingStack() {
   unsigned int m = 0xDDDDFFFF;
 
   //init the array A and array B
-  for (i = 0; i < 10; i++) {
+  for (i = 0; i < 20; i++) {
     szTest_A[i] = 0xAAAAAAA0 + i;
   }
 
@@ -168,7 +168,7 @@ int testFullDescendingStack() {
   }
 #ifdef __ANDROID__
   sleep(30);
-  raise(SIGTRAP);
+  //raise(SIGTRAP);
 #endif
   return rc;
 }

06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[0] MEM( 0xffeef328 ) = 0xaaaaaaa0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[1] MEM( 0xffeef32c ) = 0xaaaaaaa1 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[2] MEM( 0xffeef330 ) = 0xaaaaaaa2 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[3] MEM( 0xffeef334 ) = 0xaaaaaaa3 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[4] MEM( 0xffeef338 ) = 0xaaaaaaa4 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[5] MEM( 0xffeef33c ) = 0xaaaaaaa5 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[6] MEM( 0xffeef340 ) = 0xaaaaaaa6 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[7] MEM( 0xffeef344 ) = 0xaaaaaaa7 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[8] MEM( 0xffeef348 ) = 0xaaaaaaa8 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_A[9] MEM( 0xffeef34c ) = 0xaaaaaaa9 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: ====================================== 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: k MEM( 0xffeef2fc ) = 0xcccceeee, x MEM( 0xffeef2f8 ) = 0xbbbbdddd, m MEM( 0xffeef2f4 ) = 0xddddffff 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: ====================================== 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[0] MEM( 0xffeef300 ) = 0xbbbbbbb0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[1] MEM( 0xffeef304 ) = 0xbbbbbbb1 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[2] MEM( 0xffeef308 ) = 0xbbbbbbb2 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[3] MEM( 0xffeef30c ) = 0xbbbbbbb3 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[4] MEM( 0xffeef310 ) = 0xbbbbbbb4 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[5] MEM( 0xffeef314 ) = 0xbbbbbbb5 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[6] MEM( 0xffeef318 ) = 0xbbbbbbb6 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[7] MEM( 0xffeef31c ) = 0xbbbbbbb7 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[8] MEM( 0xffeef320 ) = 0xbbbbbbb8 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[9] MEM( 0xffeef324 ) = 0xbbbbbbb9 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: ====================================== 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-50] MEM( 0xffeef238 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-49] MEM( 0xffeef23c ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-48] MEM( 0xffeef240 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-47] MEM( 0xffeef244 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-46] MEM( 0xffeef248 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-45] MEM( 0xffeef24c ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-44] MEM( 0xffeef250 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-43] MEM( 0xffeef254 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-42] MEM( 0xffeef258 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-41] MEM( 0xffeef25c ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-40] MEM( 0xffeef260 ) = 0x0 
06-18 21:28:06.475 26820 26820 E QIANG_DEMO_TEST: szTest_B[-39] MEM( 0xffeef264 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-38] MEM( 0xffeef268 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-37] MEM( 0xffeef26c ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-36] MEM( 0xffeef270 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-35] MEM( 0xffeef274 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-34] MEM( 0xffeef278 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-33] MEM( 0xffeef27c ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-32] MEM( 0xffeef280 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-31] MEM( 0xffeef284 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-30] MEM( 0xffeef288 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-29] MEM( 0xffeef28c ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-28] MEM( 0xffeef290 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-27] MEM( 0xffeef294 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-26] MEM( 0xffeef298 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-25] MEM( 0xffeef29c ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-24] MEM( 0xffeef2a0 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-23] MEM( 0xffeef2a4 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-22] MEM( 0xffeef2a8 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-21] MEM( 0xffeef2ac ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-20] MEM( 0xffeef2b0 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-19] MEM( 0xffeef2b4 ) = 0xe80c074f 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-18] MEM( 0xffeef2b8 ) = 0xffeef29c 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-17] MEM( 0xffeef2bc ) = 0xb08cd1e5 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-16] MEM( 0xffeef2c0 ) = 0xffffffce 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-15] MEM( 0xffeef2c4 ) = 0xffeef300 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-14] MEM( 0xffeef2c8 ) = 0xb08ccbf5 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-13] MEM( 0xffeef2cc ) = 0xfffffff2 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-12] MEM( 0xffeef2d0 ) = 0xffeef2cc 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-11] MEM( 0xffeef2d4 ) = 0xffeef2cc 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-10] MEM( 0xffeef2d8 ) = 0xbbbbdddd 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-9] MEM( 0xffeef2dc ) = 0xffeef2f4 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-8] MEM( 0xffeef2e0 ) = 0xddddffff 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-7] MEM( 0xffeef2e4 ) = 0xddddffff 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-6] MEM( 0xffeef2e8 ) = 0xcccceeee 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-5] MEM( 0xffeef2ec ) = 0xffeef310 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-4] MEM( 0xffeef2f0 ) = 0xffeef324 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-3] MEM( 0xffeef2f4 ) = 0xddddffff 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-2] MEM( 0xffeef2f8 ) = 0xbbbbdddd 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[-1] MEM( 0xffeef2fc ) = 0xcccceeee 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[0] MEM( 0xffeef300 ) = 0xbbbbbbb0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[1] MEM( 0xffeef304 ) = 0xbbbbbbb1 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[2] MEM( 0xffeef308 ) = 0xbbbbbbb2 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[3] MEM( 0xffeef30c ) = 0xbbbbbbb3 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[4] MEM( 0xffeef310 ) = 0xbbbbbbb4 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[5] MEM( 0xffeef314 ) = 0xbbbbbbb5 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[6] MEM( 0xffeef318 ) = 0xbbbbbbb6 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[7] MEM( 0xffeef31c ) = 0xbbbbbbb7 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[8] MEM( 0xffeef320 ) = 0xbbbbbbb8 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[9] MEM( 0xffeef324 ) = 0xbbbbbbb9 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[10] MEM( 0xffeef328 ) = 0xaaaaaaa0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[11] MEM( 0xffeef32c ) = 0xaaaaaaa1 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[12] MEM( 0xffeef330 ) = 0xaaaaaaa2 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[13] MEM( 0xffeef334 ) = 0xaaaaaaa3 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[14] MEM( 0xffeef338 ) = 0xaaaaaaa4 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[15] MEM( 0xffeef33c ) = 0xaaaaaaa5 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[16] MEM( 0xffeef340 ) = 0xaaaaaaa6 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[17] MEM( 0xffeef344 ) = 0xaaaaaaa7 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[18] MEM( 0xffeef348 ) = 0xaaaaaaa8 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[19] MEM( 0xffeef34c ) = 0xaaaaaaa9 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[20] MEM( 0xffeef350 ) = 0xaaaaaaaa 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[21] MEM( 0xffeef354 ) = 0xaaaaaaab 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[22] MEM( 0xffeef358 ) = 0xaaaaaaac 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[23] MEM( 0xffeef35c ) = 0xaaaaaaad 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[24] MEM( 0xffeef360 ) = 0xaaaaaaae 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[25] MEM( 0xffeef364 ) = 0xaaaaaaaf 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[26] MEM( 0xffeef368 ) = 0xaaaaaab0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[27] MEM( 0xffeef36c ) = 0xaaaaaab1 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[28] MEM( 0xffeef370 ) = 0xaaaaaab2 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[29] MEM( 0xffeef374 ) = 0xaaaaaab3 

06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[30] MEM( 0xffeef378 ) = 0x77 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[31] MEM( 0xffeef37c ) = 0xffffffff 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[32] MEM( 0xffeef380 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[33] MEM( 0xffeef384 ) = 0x12345678 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[34] MEM( 0xffeef388 ) = 0xe80c074f 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[35] MEM( 0xffeef38c ) = 0xb08ccdfd 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[36] MEM( 0xffeef390 ) = 0xffeef3e4 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[37] MEM( 0xffeef394 ) = 0x1 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[38] MEM( 0xffeef398 ) = 0xffeef3ec 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[39] MEM( 0xffeef39c ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[40] MEM( 0xffeef3a0 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[41] MEM( 0xffeef3a4 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[42] MEM( 0xffeef3a8 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[43] MEM( 0xffeef3ac ) = 0xe92e1837 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[44] MEM( 0xffeef3b0 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[45] MEM( 0xffeef3b4 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[46] MEM( 0xffeef3b8 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[47] MEM( 0xffeef3bc ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[48] MEM( 0xffeef3c0 ) = 0x0 
06-18 21:28:06.476 26820 26820 E QIANG_DEMO_TEST: szTest_B[49] MEM( 0xffeef3c4 ) = 0xb08cc5a3 
 

--------- beginning of crash
06-18 21:28:36.480 26820 26820 F libc    : stack corruption detected (-fstack-protector)
06-18 21:28:36.481 26820 26820 F libc    : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 26820 (demo_test), pid 26820 (demo_test)
06-18 21:28:36.479 26820 26820 I demo_test: type=1400 audit(0.0:343): avc: denied { sys_resource } for capability=24 scontext=u:r:shell:s0 tcontext=u:r:shell:s0 tclass=capability permissive=1 ppid=7874 pcomm="adbd" pgid=26820 pgcomm="demo_test"
06-18 21:28:36.527 26827 26827 I crash_dump32: obtaining output fd from tombstoned, type: kDebuggerdTombstone
06-18 21:28:36.528  1036  1036 I /system/bin/tombstoned: received crash request for pid 26820
06-18 21:28:36.529 26827 26827 I crash_dump32: performing dump of process 26820 (target tid = 26820)
06-18 21:28:36.532 26827 26827 F DEBUG   : Revision: '0'
06-18 21:28:36.532 26827 26827 F DEBUG   : ABI: 'arm'
06-18 21:28:36.532 26827 26827 F DEBUG   : pid: 26820, tid: 26820, name: demo_test  >>> /vendor/bin/hw/demo_test <<<
06-18 21:28:36.532 26827 26827 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
06-18 21:28:36.532 26827 26827 F DEBUG   : Abort message: 'stack corruption detected (-fstack-protector)'
06-18 21:28:36.532 26827 26827 F DEBUG   :     r0  00000000  r1  000068c4  r2  00000006  r3  00000008
06-18 21:28:36.532 26827 26827 F DEBUG   :     r4  000068c4  r5  000068c4  r6  ffeef2ac  r7  0000010c
06-18 21:28:36.532 26827 26827 F DEBUG   :     r8  ffeef328  r9  b08cd09c  r10 ffeef348  r11 ffeef34c
06-18 21:28:36.532 26827 26827 F DEBUG   :     ip  e92fb3cc  sp  ffeef298  lr  e926605d  pc  e925cfde
06-18 21:28:36.534 26827 26827 F DEBUG   : 
06-18 21:28:36.534 26827 26827 F DEBUG   : backtrace:
06-18 21:28:36.534 26827 26827 F DEBUG   :     #00 pc 0001cfde  /system/lib/libc.so (abort+58)
06-18 21:28:36.534 26827 26827 F DEBUG   :     #01 pc 000605e7  /system/lib/libc.so (__stack_chk_fail+10)
06-18 21:28:36.534 26827 26827 F DEBUG   :     #02 pc 00000d6b  /vendor/bin/hw/demo_test (testFullDescendingStack()+1962)
06-18 21:28:36.534 26827 26827 F DEBUG   :     #03 pc aaaaaab3  <unknown>

 

2. ARM DS-5 Cortex A9 FVP 運行結果:

嚴格遵守 Full Descending Stack 規律,k 在最高地址,m 在最低地址。

 

3. x86 編譯,運行,使用 gdb 調試該程序:

$ gdb ./main

// 設斷點
(gdb) break main.cpp:158
Breakpoint 1 at 0x80487c9: file main.cpp, line 158.
(gdb) run ./main
Starting program: ./main
main 162 
testBigLittleEndian 36 
Little-Endian. 
testBigLittleEndian 43 
testPointerTrans 64 
MEM addr 0xffffc6a8 [0] = 0x78 
MEM addr 0xffffc6a9 [1] = 0x56 
MEM addr 0xffffc6aa [2] = 0x34 
MEM addr 0xffffc6ab [3] = 0x12 
testPointerTrans 69 
testIntRange 92 
i = 2147483647, j = -2147483648, k = -1
testIntRange 96 
testSignedPlusUnsignedInt 115 
i = -2, j = 1, i + j = 4294967295
testSignedPlusUnsignedInt 119 
szTest_A[0] is 0xaaaaaaa0, its memory address is 0xffffc65c 
szTest_A[1] is 0xaaaaaaa1, its memory address is 0xffffc660 
szTest_A[2] is 0xaaaaaaa2, its memory address is 0xffffc664 
szTest_A[3] is 0xaaaaaaa3, its memory address is 0xffffc668 
szTest_A[4] is 0xaaaaaaa4, its memory address is 0xffffc66c 
szTest_A[5] is 0xaaaaaaa5, its memory address is 0xffffc670 
szTest_A[6] is 0xaaaaaaa6, its memory address is 0xffffc674 
szTest_A[7] is 0xaaaaaaa7, its memory address is 0xffffc678 
szTest_A[8] is 0xaaaaaaa8, its memory address is 0xffffc67c 
szTest_A[9] is 0xaaaaaaa9, its memory address is 0xffffc680 
====================================== 
k = 0xcccceeee, x = 0xbbbbdddd, m = 0xddddffff 
szTest_B[0] is 0xbbbbbbb0, its memory address is 0xffffc684  
szTest_B[1] is 0xbbbbbbb1, its memory address is 0xffffc688  
szTest_B[2] is 0xbbbbbbb2, its memory address is 0xffffc68c  
szTest_B[3] is 0xbbbbbbb3, its memory address is 0xffffc690  
szTest_B[4] is 0xbbbbbbb4, its memory address is 0xffffc694  
szTest_B[5] is 0xbbbbbbb5, its memory address is 0xffffc698  
szTest_B[6] is 0xbbbbbbb6, its memory address is 0xffffc69c  
szTest_B[7] is 0xbbbbbbb7, its memory address is 0xffffc6a0  
szTest_B[8] is 0xbbbbbbb8, its memory address is 0xffffc6a4  
szTest_B[9] is 0xbbbbbbb9, its memory address is 0xffffc6a8  

Breakpoint 1, testFullDescendingStack () at main.cpp:159
159	}

// Callstack
(gdb) bt full
#0  testFullDescendingStack () at main.cpp:159
        i = 10
        szTest_A = {2863311520, 2863311521, 2863311522, 2863311523, 2863311524, 2863311525, 2863311526, 2863311527, 2863311528, 2863311529}
        szTest_B = {3149642672, 3149642673, 3149642674, 3149642675, 3149642676, 3149642677, 3149642678, 3149642679, 3149642680, 3149642681}
#1  0x08048403 in main () at main.cpp:167
        __func__ = "main"

// 查看內存		
(gdb) x /x 0xffffc65c
0xffffc65c:	0xaaaaaaa0

(gdb) x /x 0xffffc684
0xffffc684:	0xbbbbbbb0



(gdb) i proc mappings 
process 135308
Mapped address spaces:

	Start Addr   End Addr       Size     Offset objfile
	 0x8048000  0x8049000     0x1000        0x0 main
	 0x8049000  0x804a000     0x1000        0x0 main
	 0x804a000  0x804b000     0x1000     0x1000 main
	 0x804b000  0x806c000    0x21000        0x0 [heap]
	0xf7df7000 0xf7df8000     0x1000        0x0 
	0xf7df8000 0xf7fa8000   0x1b0000        0x0 /lib/i386-linux-gnu/libc-2.23.so
	0xf7fa8000 0xf7faa000     0x2000   0x1af000 /lib/i386-linux-gnu/libc-2.23.so
	0xf7faa000 0xf7fab000     0x1000   0x1b1000 /lib/i386-linux-gnu/libc-2.23.so
	0xf7fab000 0xf7fae000     0x3000        0x0 
	0xf7fd4000 0xf7fd5000     0x1000        0x0 
	0xf7fd5000 0xf7fd8000     0x3000        0x0 [vvar]
	0xf7fd8000 0xf7fd9000     0x1000        0x0 [vdso]
	0xf7fd9000 0xf7ffc000    0x23000        0x0 /lib/i386-linux-gnu/ld-2.23.so
	0xf7ffc000 0xf7ffd000     0x1000    0x22000 /lib/i386-linux-gnu/ld-2.23.so
	0xf7ffd000 0xf7ffe000     0x1000    0x23000 /lib/i386-linux-gnu/ld-2.23.so
	0xfffdc000 0xffffe000    0x22000        0x0 [stack]

(gdb) display /i $pc
1: x/i $pc
=> 0x8048403 <main()+67>:	push   $0xa8
(gdb) disassemble /r main
Dump of assembler code for function main():
   0x080483c0 <+0>:	8d 4c 24 04	lea    0x4(%esp),%ecx
   0x080483c4 <+4>:	83 e4 f0	and    $0xfffffff0,%esp
   0x080483c7 <+7>:	ff 71 fc	pushl  -0x4(%ecx)
   0x080483ca <+10>:	55	push   %ebp
   0x080483cb <+11>:	89 e5	mov    %esp,%ebp
   0x080483cd <+13>:	51	push   %ecx
   0x080483ce <+14>:	83 ec 04	sub    $0x4,%esp
   0x080483d1 <+17>:	68 a2 00 00 00	push   $0xa2
   0x080483d6 <+22>:	68 88 89 04 08	push   $0x8048988
   0x080483db <+27>:	68 70 88 04 08	push   $0x8048870
   0x080483e0 <+32>:	6a 01	push   $0x1
   0x080483e2 <+34>:	e8 b9 ff ff ff	call   0x80483a0 <__printf_chk@plt>
   0x080483e7 <+39>:	83 c4 10	add    $0x10,%esp
   0x080483ea <+42>:	e8 31 01 00 00	call   0x8048520 <testBigLittleEndian()>
   0x080483ef <+47>:	e8 6c 01 00 00	call   0x8048560 <testPointerTrans()>
   0x080483f4 <+52>:	e8 f7 01 00 00	call   0x80485f0 <testIntRange()>
   0x080483f9 <+57>:	e8 42 02 00 00	call   0x8048640 <testSignedPlusUnsignedInt()>
   0x080483fe <+62>:	e8 8d 02 00 00	call   0x8048690 <testFullDescendingStack()>
=> 0x08048403 <+67>:	68 a8 00 00 00	push   $0xa8
   0x08048408 <+72>:	68 88 89 04 08	push   $0x8048988
   0x0804840d <+77>:	68 70 88 04 08	push   $0x8048870
   0x08048412 <+82>:	6a 01	push   $0x1
   0x08048414 <+84>:	e8 87 ff ff ff	call   0x80483a0 <__printf_chk@plt>
   0x08048419 <+89>:	8b 4d fc	mov    -0x4(%ebp),%ecx
   0x0804841c <+92>:	83 c4 10	add    $0x10,%esp
   0x0804841f <+95>:	31 c0	xor    %eax,%eax
   0x08048421 <+97>:	c9	leave  
   0x08048422 <+98>:	8d 61 fc	lea    -0x4(%ecx),%esp
   0x08048425 <+101>:	c3	ret    
End of assembler dump.

https://wizardforcel.gitbooks.io/100-gdb-tips/tui-mode.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章