可以在C中进行热代码交换吗?

时间:2010-10-19 23:05:41

标签: c gcc gdb hotswap

en.wikipedia.org/wiki/Hot_swapping#cite_note-1

说VS可以在其调试器的帮助下完成。 gdb是否提供类似的功能?

这是我能找到的最接近的,但似乎还没准备好使用:

http://www.aitdspace.gr/xmlui/handle/123456789/219

dlopen / dlsym / dlclose也很接近,但不适用于-lmylib引用的库(引用计数永远不会为0)。

我考虑过的替代方案:

1)使用-Wl,-wrap,foo和on __wrap_foo(){func = dlopen(); FUNC(); }

2)使libfoo.so成为一个共享库,当我们需要hotswap时,我们dlopen(RTLD_GLOBAL)加载新代码并为下一次调用foo()提供更新的符号;

1)不能很好地工作,因为它需要我枚举我想要热切换的所有功能,这些功能都是热门功能。

2)不能很好地工作,因为当调用foo()时,会加载新代码,但foo永远会引用该符号。多次调用dlopen使foo得到重新评估。

3 个答案:

答案 0 :(得分:2)

您可能对Ksplice感兴趣。这是一种来自MIT的技术,它允许将软件补丁应用于Linux内核而无需重新启动。这与应用安全更新最相关:

http://www.ksplice.com/paper

答案 1 :(得分:0)

你当然可以自己破解一个存储函数指针列表的系统,并且可以将这些指针改为指向你当时dlopen()的任何库。

你是对的,没有任何简单的方法来拦截对具有固定连接的例程的调用。你总是可以通过程序集跳转到另一个例程来破坏例程的开始,但这可能是危险的(并且不是C)。

也许在你的代码中代表性弱且在dlopen()库中强大的符号会起作用吗?

在任何这些情况下,您都必须处理当前运行旧代码的情况。这也不容易,除非你的程序中有点你知道你想要交换的库中没有线程。

答案 2 :(得分:0)

我找到的最近的是solari dbx,它带有oracle开发者工作室,但是dev studio在linux和solaris中都使用了dbx,只有solaris版本支持"编辑并继续"或"热门代码交换"