一、编译选项定位堆栈溢出
1、栈溢出可能打印
unhandled level 1 translation fault (11) at 0x7f8d0347, esr 0x92000005
2、栈溢出保护机制
gcc提供了栈保护机制stack-protector(编译选项-fstack-protector-all
),开启了栈保护机制后,可检测运行时栈溢出。
加了栈保护机制后堆栈溢出的代码运行将打印:
*** stack smashing detected ***: <unknown> terminated<br>
stackoverfloooooooooooooooooooooooooooooooooooooooooooooooooooAborted
二、GDB多线程调试
gdb命令:
来源:GDB多线程调试(调试命令+调试演示)_Xtiz的博客-CSDN博客_gdb多线程调试
(1)查看可切换调试的线程:info threads
(2)切换调试的线程:thread 线程id
(3)只运行当前线程:set scheduler-locking on
(4)运行全部的线程:set scheduler-locking off
(5)指定某线程执行某gdb命令:thread apply 线程id gdb_cmd
(6)全部的线程执行某gdb命令:thread apply all gdb_cmd
二、栈指针
来源:使用 GDB 查看程序的栈空间 | Linux 中国 - 知乎
有一个名为 ESP 的 x86 寄存器,称为“ 栈指针(stack pointer)”。 基本上,它是当前函数的栈起始地址。 在 GDB 中,你可以使用 $sp
来访问它。
首先,让我们看一下 main 函数开始时的栈。 现在是我们的堆栈指针的值:
(gdb) p $sp
$7 = (void *) 0x7fffffffe270
我们当前函数的栈起始地址是 0x7fffffffe270
。
linux各种栈介绍:
Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈_Yakir Yang的博客-CSDN博客_一个进程几个堆几个栈
【ARM Linux 系统稳定性分析入门及渐进 3 -- 栈溢出】_arm栈溢出_CodingCos的博客-CSDN博客