从调用堆栈获取函数指针

Get Function Pointer from Call Stack

本文关键字:函数 指针 获取 堆栈 调用      更新时间:2023-10-16

我想将多线程添加到不支持多线程或函数指针,但支持从.dll 运行函数的语言(BlitzBasic)中

该语言的编译器编译成某种形式的C,然后将其编译成本机代码。它仅适用于Windows。

到目前为止,我的想法是在dll中创建一个函数,该函数将从BlitzBasic中调用。此函数将检查调用堆栈,以找出调用它的位置。然后它会分叉一个新线程并返回。新线程将等待一小段时间(10ms左右),然后在BlitzBasic中调用函数的位置恢复执行。在BlitzBasic中,你必须根据延迟来控制其余的执行(因此,第一个退出该函数的线程将设置一个变量,告诉第二个线程执行一些不同的函数

我知道多线程会带来很多其他问题,但当我到达那里时,我会跨过这座桥。

有没有办法在调用堆栈中找到函数的执行点?

函数指针在此上下文中是不够的,因为函数指针只允许您从函数的开头调用函数,但您已经处于函数的中间。

您可以使用setjmp/longjmp,但除非在设计原始语言时考虑到线程安全,否则您可能会遇到很多问题。

特别是如果你的语言有任何全局状态,你将不得不围绕它创建锁

就我个人而言,我只会使用堆栈本身进行恢复,并拥有您的函数块,直到它准备好返回。您仍然可以生成一个新线程。这会容易得多。您也可以从一个更简单的协作线程模型开始,而不是从抢占开始。这会让你看看它是否可行。

这类似于setjmplongjmp

你必须小心这些,因为正常的出口清理不会发生。

您将不得不使用汇编语言。您需要一个汇编语言函数,它可以向上遍历一个堆栈堆栈框架。

通常帧指针寄存器指向当前堆栈帧。然后,您需要检查帧并定位保存的帧指针(例程调用方的指针)。帧指针通常指向返回时要执行的下一条指令的保存地址。