无法挂钩回调函数?

Posted

技术标签:

【中文标题】无法挂钩回调函数?【英文标题】:Cannot hook Callback function? 【发布时间】:2011-10-27 14:53:01 【问题描述】:

我在我的代码中挂钩了几个函数,直到今天它的代码都很漂亮,然后由于回调函数,我遇到了一个错误。

让我们说..

如果我做类似的事情

puts("Hi!\n");

效果很好。我可以挂这个。

但如果我这样做......

typeof(puts) *fptr = puts;
fptr("Hi \n");

挂钩不起作用?

我正在使用 OSX 环境并搜索符号以进行挂钩。 有人可以建议我回调函数有什么问题以及我应该做什么来挂钩挂钩算法吗?

编辑:我做了更多的调试,以防万一有以下信息的人可以提供一些意见。

我认为这可能是问题的根源?

bool Hook(const char *name, void *impl) 
    ...   
    void **EntryInAdressTable = find(name);
    if(EntryInAdressTable) 
        *EntryInAdressTable = impl;
    

 ...

所以,这里发生的事情是,我用我的实现更改地址表中对应符号的条目,在我的实现中我调用原始函数。

所以,我的猜测是,如果我们使用回调函数,这意味着我们直接引用函数地址而不通过地址表,这就是为什么不调用钩子方法的原因。

我说的对吗?如果是这样,任何人都可以建议我任何解决方法吗?

【问题讨论】:

typeof 在 C++ 中? 0_o ,看起来像 C# 代码 @Mr.Anubis typeof 是 C 和 C++ 的 GCC 扩展。 @Mac:挂钩可以表示任意数量的东西,具体取决于上下文。 我认为你误用了钩子这个词。挂钩通常意味着拦截一个正常的呼叫并用你自己的替换它。 我知道 typedef。 typeof 只是获取回调函数的快捷方式。 【参考方案1】:

假设您使用LD_PRELOAD 挂钩您的函数,当您获取指向puts 的指针时,该指针可能会绑定到链接器在您链接时知道的版本,在标准库中,并且不是t 在您的预加载库开始存在时被覆盖。我想不出任何办法绕过这个。

【讨论】:

我没有指向puts。我采用符号“_puts”。然后我查找命令并尝试查找该字符串是否存在。 我已经用我的发现更新了问题。请告诉我你的想法【参考方案2】:

如果我们通过查看符号表并替换与符号条目对应的函数地址来进行挂钩,只要我们使用符号表中的符号条目进行函数调用就可以工作。如果我们直接使用函数地址(回调函数)是不行的。

【讨论】:

以上是关于无法挂钩回调函数?的主要内容,如果未能解决你的问题,请参考以下文章

在回调函数中使用 setState 挂钩时反应过多的重新渲染

提交值时如何在 React 挂钩中使用回调函数?

C ++中的延迟执行策略

没有可行的重载'='用于将std :: function回调赋值为成员函数

挂钩 C 函数

ajax回调函数无法获取后台传过来的值(SSM框架),大神请指教!