如何“避免” SIGSEGV?

Posted

技术标签:

【中文标题】如何“避免” SIGSEGV?【英文标题】:How can you "avoid" a SIGSEGV? 【发布时间】:2010-03-24 19:59:00 【问题描述】:

我正在编写一个客户端-服务器应用程序,其中客户端从服务器端获得了确定的内存地址。

如果出现问题并且需要重新启动服务器,则客户端拥有的地址不再有效。当使用一个使用该无效信息的函数时,一个 SIGSEGV 将被发送到服务器,因为地址可能不再是它了。

服务器如何保护自己免受 SIGSEGV 的影响并继续接受连接并正常运行?发生这种情况时有什么办法不让服务器崩溃?

非常感谢。

【问题讨论】:

您是否将内存地址传递给客户端,然后再传回服务器? 【参考方案1】:

客户端不应该向服务器发送内存地址,期间。如果客户端需要对服务器资源的引用,服务器应该为它提供某种句柄,服务器可以将其转换为地址,但不能直接取消引用。

在您的情况下,服务器重新启动可能导致客户端的句柄无效。服务器应该注意到这一点并向客户端返回一个易于理解的错误代码,告诉它获取新的资源句柄。

【讨论】:

正确。将指针传递给客户端,反之亦然:) 没错。在这种情况下,就 VMM 而言,服务器就像一个内核。它必须维护一个哪些句柄指向哪些真实地址的列表。【参考方案2】:

管理存储指针的连接表。如果服务器重新启动,它会重建一个新表。客户端只知道其连接的索引(或键等)。

没有指定上下文,但是向客户端发送指针可能是一个很大的安全漏洞,因为客户端很容易使服务器崩溃。

【讨论】:

【参考方案3】:

不要使用指针,而是使用数组或映射的索引。这可能会导致索引被重用,但很容易检测并忽略严重无效的索引。

【讨论】:

以上是关于如何“避免” SIGSEGV?的主要内容,如果未能解决你的问题,请参考以下文章

如何捕捉并分析SIGSEGV的现场

分段错误错误(信号名称:SIGSEGV)的原因是啥,我将如何找到/修复它?

Qt-opengl-debug-SIGSEGV-如何修复?

什么导致 SIGSEGV

sigsegv 在 iPhone 上因 crittercism 崩溃

SIGSEGV,分段错误。 while printf() 数组索引的值