劳特巴赫(Ralph Bach)的stackframe with local是一种堆栈帧技术,可以用来观测堆栈数据。它可以被用来跟踪函数调用,检测函数参数和局部变量,以及检测函数返回值。它通过分析堆栈帧中的局部变量和参数,来检测函数调用的参数和结果。它还可以用来跟踪函数调用,检测函数参数和局部变量,以及检测函数的返回值。堆栈帧中有一个指针叫做栈指针,它指向堆栈帧中的最后一个变量。当程序执行时,栈指针会指向栈帧中的最后一个变量,从而可以观测到堆栈中的数据。栈指针可以用来跟踪程序的堆栈帧,从而访问局部变量。
p是指向局部变量的指针,当函数退出时,局部变量会被释放,这时,p所指向的位置就不一样是原来的数。
因为fun()函数返回的值被计算机的临时变量存放,当赋值给p的时候,p是指向临时变量的地址,所以还可以读取出100。
p = "hello"这是常量字符串,从静态存储区分配,第一步字符串"hello"从静态存储区获取一块内存,指针变量p才指向这块静态内存,这块内存的特点是从程序开始到结束一直从在,所以可以返回。
扩展资料:
函数的返回值类型是在定义函数时指定的。return 语句中表达式的类型应与定义函数时指定的返回值类型一致。如果不一致,则以函数定义时的返回值类型为准,对 return 语句中表达式的类型自动进行转换,然后再将它返回给主调函数使用。
在调用函数时,如果需要从被调函数返回一个值供主调函数使用,那么返回值类型必须定义成非 void 型。此时被调函数中必须包含 return 语句,而且 return 后面必须要有返回值,否则就是语法错误。
参考资料来源:百度百科-返回值
运行时出现了段错误,然后来看内存转储后得到的内容。
1、首先查看栈帧的内容
(gdb) bt
#0 0x6a696968 in ()
#1 0x6c6b6b6a in ()
#2 0x6e6d6d6c in ()
#3 0x706f6f6e in ()
#4 0x72717170 in ()
#5 0x74737372 in ()
#6 0xbff60074 in ()
Backtrace stopped: previous frame inner to this frame (corrupt stack)
栈中所有函数指针全部显示成“?”,从中无法获取任何信息,这种情况可以怀疑是栈缓冲溢出。
然后看最后1行,它就提示我们有可能是栈指针出现的错误,所以我们需要做的事情就是去查看这个栈指针怎么回事。
(gdb) x/30c $esp-15
0xbff6a311: 99 'c' 99 'c' 100 'd' 100 'd' 101 'e' 101 'e' 102 'f' 102 'f'
0xbff6a319: 103 'g' 103 'g' 104 'h' 104 'h' 105 'i' 105 'i' 106 'j' 106 'j'
0xbff6a321: 107 'k' 107 'k' 108 'l' 108 'l' 109 'm' 109 'm' 110 'n' 110 'n'
0xbff6a329: 111 'o' 111 'o' 112 'p' 112 'p' 113 'q' 113 'q'
(gdb) p (char )$esp-20
$1 = 0xbff6a30c "\005aabbccddeeffgghhiijjkkllmmnnooppqqrrsstt"
(gdb) p (char )$esp+20
$2 = 0xbff6a334 "t"
发现在寄存器esp两边都是字符串,问题就出在这里了:原来调用函数时推入到栈中的跳转指针被字符串给覆盖了,结果在函数返回的时候,找不到返回的地址,出现了段错误。
3、定位源码中的错误。
以上就是关于劳特巴赫的stackframe with local是如何观测到堆栈数据的全部的内容,包括:劳特巴赫的stackframe with local是如何观测到堆栈数据的、C语言中函数返回指向栈内存的指针的问题、GDB迷路时堆栈指针手动更改问题,怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)