This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C129EKCPDT:使用 wolfSSL v3.9.6时内存泄漏

Guru**** 2330840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/594994/rtos-tm4c129ekcpdt-memory-leak-when-using-wolfssl-v3-9-6

器件型号:TM4C129EKCPDT

工具/软件:TI-RTOS

编辑:使用 wolfSSL v3.9.11可修复此问题。

您好!

加载测试使用 WolfSSL v3.9.6和 TI-RTOS v2.16.01.14构建的 HTTPS 服务器时,我遇到内存不足问题,这些服务器在我的定制板上的 TM4C129芯片上运行。

为了排除因实施而导致的任何问题并缩小问题范围、我设置并运行 TI-RTOS 示例中提供的 tcpEchoTLS 示例代码。

为了测试 SSL 连接、 我使用了 slscan 工具(可从 https://github.com/rbsec/sslscan/releases/tag/1.11.0-rbsec 获取)

sslscan 工具成功测试了 SSL 连接,但我注意到这会导致在 RTOS 对象视图(ROV) HeapTrack 中的 TaskAllocList 中创建新的孤立堆块。 如果我重复运行 SSL 扫描、孤立块的数量会增加、直到我耗尽堆内存。

根据我过去几天的调查、当 WolfSSL 出现错误时、似乎会发生这种情况(请参阅我的 Live Session 选项卡的屏幕截图)。 我附加了屏幕截图、其中显示了一次测试的结果、这表明当错误发生时、似乎发生了内存泄漏。


注-我对 tcpEchoTLS 示例代码所做的修改:

  1. 使用计数信标将并发连接的数量限制为3。
  2. 将 TCP 服务器更改为侦听端口443 (用于 SSL 连接)
  3. 添加了 Log_info 语句以记录 WolfSSL 错误。

tcpWorker(){
…
/*在我们接收数据时循环*/
/*在我们接收数据时循环*/
while ((bytesRcvd = wolfSSL_recv (SSL、(char *) buffer、TCPPACKETSIZE、0)))
>0){
bytesSent = wolfSSL_send (SSL、(char *) buffer、bytesRcvd、0);
if (bytesSent < 0 || bytesSent!= bytesRcvd){
System_printf ("tcpWorker:发送失败。\n");
中断;
}
}
int errorCode = wolfSSL_get_error (SSL、bytesRcvd);
if (错误代码!= SSL_ERROR_NONE)
{
log_info1 ("WolfSSL 错误[%d]"、errorCode);
}

...} 


这是我的 tcpEchoTLS 项目的 zip 文件。

e2e.ti.com/.../tcpEchoTLS.zip

如果有任何关于如何解决此问题的提示、我们将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aaron、

    您能否尝试以下步骤:

    1.我看不到在 TCP 工作任务上调用 Task_delete ()。 这些任务是以巨大的堆栈大小(32768)创建的,只有在调用 Task_delete ()时才会释放这些任务。 在 software-dl.ti.com/.../Task.html 中阅读有关任务删除的信息

    如果步骤1无法解决内存泄漏问题、让我们在 wolfSSL 中启用调试语句。 使用-DWOLFSSL_DEBUG 重建 wolfSSL 库(将其添加到 github.com/.../wolfssl.bld 中的'wolfsslPathInclude'中) ,并在 tcpHandler()中,在 wolfSSL_init()之后调用 wolfSSL_Debugging on ()。 运行应用程序时、您将看到控制台上打印的 wolfSSL 调试语句。 这些语句可能包含有关内存分配/解分配的提示。

    有关 wolfSSL 调试的更多信息、请阅读 www.wolfssl.com/.../Docs-wolfssl-manual-8-debugging.html

    Vikram
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Adiga 先生

    非常好-细节很好、背接地(即注意巨大的堆栈尺寸)并且快速到达。 好极了...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vikram、您好、感谢您的快速回复

    在(1)上、根据 NDK 模块的配置、已终止的任务会在空闲循环中自动删除。
    (2)感谢调试说明、我将对此进行研究。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此问题的修复方法是使用最新的 wolfSSL 版本 v3.11.0

    在 v3.9.6中,如果握手失败,则不调用 wolfsl/src/internal.c 中的函数 FreeHandshakeResources()(释放 SSL 握手期间分配的缓冲区)。 这会导致内存泄漏。 此问题已在 v3.11.0中得到解决

      更新 wiki 页面以让其他人知道可以使用 v3.11.0会有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您能解决此问题。

    我们将查看最新的 wolfSSL v3.11.0发布并更新 wiki。

    谢谢、
    Vikram