此
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得到重新评估。
答案 0 :(得分:2)
您可能对Ksplice感兴趣。这是一种来自MIT的技术,它允许将软件补丁应用于Linux内核而无需重新启动。这与应用安全更新最相关:
答案 1 :(得分:0)
你当然可以自己破解一个存储函数指针列表的系统,并且可以将这些指针改为指向你当时dlopen()的任何库。
你是对的,没有任何简单的方法来拦截对具有固定连接的例程的调用。你总是可以通过程序集跳转到另一个例程来破坏例程的开始,但这可能是危险的(并且不是C)。
也许在你的代码中代表性弱且在dlopen()库中强大的符号会起作用吗?
在任何这些情况下,您都必须处理当前运行旧代码的情况。这也不容易,除非你的程序中有点你知道你想要交换的库中没有线程。
答案 2 :(得分:0)
我找到的最近的是solari dbx,它带有oracle开发者工作室,但是dev studio在linux和solaris中都使用了dbx,只有solaris版本支持"编辑并继续"或"热门代码交换"