我正在对一个报告如下的程序进行调试:
Thread 1 "test.out" received signal SIGSEGV, Segmentation fault.然后,我对程序进行了跟踪,发现程序在调用指令SignalHandler后立即跳入call 0x401950函数。
我测试了呼叫目的地rax、rdi和rsi (呼叫输入)。但是没有什么奇怪的发现。
我以前没有遇到过这种情况,我想是由于一些豁免而产生的一个软中断,然后排在指令之后。所以实际的问题可能会更早发生。
现在我需要找出豁免的来源,这样我才能解决这个问题。但我不知道怎么做。
所以我来问是否有人能帮我这个忙。
很抱歉没有显示代码,因为它是公司的资产……
感谢任何人的帮助!
发布于 2022-03-01 16:19:26
然后,我对程序进行了
处理,发现程序在调用指令调用0x401950之后就跳入了一个SignalHandler函数。
你没有说你使用的是哪个处理器和操作系统。猜测Linux和x86_64,就会有堆栈溢出。
CALL指令将返回地址推送到堆栈上,如果堆栈耗尽,此操作将生成SIGSEGV。
您可以通过使用(gdb) where (这可能会显示非常深的递归,尽管堆栈耗尽的其他原因也是可能的)和查看RSP的值(应该在页面边界以下)来证实这一猜测。
根据堆栈大小的设置方式,在调用程序之前使用ulimit -s unlimited可能会避免这种崩溃(尽管您确实应该通过其他机制修复根本原因)。
https://stackoverflow.com/questions/71308430
复制相似问题