gpt4 book ai didi

c - GDB 影响 setcontext 结果

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:56 25 4
gpt4 key购买 nike

我正在编写一些代码,需要我手动操作一段代码的上下文,然后切换到它,而不是使用 makecontext。由于断言失败,我的测试程序在一行上失败,所以我尝试使用 GDB 来确定结果并查看该部分失败的原因,但是,当我使用 GDB v7.4.1 运行它时,它由于 null 而出现段错误地址在前面的代码部分。

上下文切换的结果如下:程序的指令指针指向一个函数的开头,该函数接受两个参数,一个指向另一个函数的指针和一些参数。 (函数将参数传递给函数指针,然后将上下文切换回来)。

我隔离了导致此问题的代码区域,这是围绕它的代码的结果。

245 setcontext(runQueue->front->currContext);
(gdb) print runQueue->front->currContext->uc_mcontext.gregs[REG_RIP]
$1 = 420391
(gdb) print runQueue->front->currContext->uc_mcontext.gregs[REG_RSP]
$2 = 1077936128
(gdb) print runQueue->front->currContext->uc_mcontext.gregs[REG_RDI]
$3 = 4199321
(gdb) print runQueue->front->currContext->uc_mcontext.gregs[REG_RSI]
$4 = 10

这就在上下文切换之前。我检查了寄存器以验证程序切换到的上下文的值是否正确,并且它们符合预期(REG_RIP:4203091 == 0x402253,REG_RSP:1077936128 == 0x40400000,REG_RDI:4199321 == 0x401399 和 REG_RSI : 0xa == 10)

进入上下文切换并跟随它脱离上下文的变化后,结果是这样的:

thread_func(function=0, arg=0x0) at thread.c:51
51 {
(gdb) info registers rip
rip 0x402253 0x402253 <thread_func>
(gdb) info registers rsp
rsp 0x40400000 0x40400000
(gdb) info registers rdi
rdi 0x401399 4199321
(gdb) info registers rsi
rsi 0xa 10

寄存器的值没有改变,但是 GDB 没有正确传入参数,程序试图使用 0 值,并且程序段错误访问空指针。

有什么办法可以解决这个问题或绕过这个问题吗?

最佳答案

The values of the registers are unchanged, but the arguments are not passed in correctly by GDB, the program attempts to utilize the 0 values, and the program segmentation faults for accessing a null pointer.

您对正在发生的事情的解释极有可能是不正确的。

特别是,您声称 NULL 取消引用的发生似乎主要是基于此:

thread_func(function=0, arg=0x0) at thread.c:51

其中 function 和 arg 的值应分别为 0x4013990xa

但是,您的函数有序言,并且您在序言执行之前停止了。 GDB 向您显示当前包含在内存位置的值,这些位置包含序言之后的参数,但您尚未将它们存储在那里。尝试 stepi 过去的序言(过去的指令 mov %rsi,-0x20(%rbp)),你会观察到 functionarg 神奇地获取正确的值。

如果您的程序稍后因 NULL 指针取消引用而崩溃,那是因为其他原因。

附言在设置 %rsp 时,您违反了 ABI 要求:x86_84 要求在每个函数内部,%rsp 是 16 字节对齐的。这意味着进入任何函数%rsp&0xF == 8(你有%rsp&0xF == 0)。这很可能会在以后导致崩溃,尤其是当您使用任何 SSE2 指令时。

您可以通过将 %rsp 设置为 mmap_addr+8 或通过使用 -mstackrealign< 编译 thread.c 来解决此问题.

关于c - GDB 影响 setcontext 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com