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.

[参考译文] TM4C1294NCPDT:使用%f 定期调用 vsnprintf 会导致堆栈溢出

Guru**** 2543380 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1038040/tm4c1294ncpdt-periodic-call-to-vsnprintf-with-f-cause-stack-overflow

器件型号:TM4C1294NCPDT

尊敬的 SupporTeam:

直列式
标准::字符串格式 LogString (const char*格式,...)  

CONST Int32 ZERO = 0;
std::string strLog ="格式化错误!\n";
va_list args;
va_start (args、format);
char formatMsg[GCProtocol::MAX_LOG_MSG_STRING_SIZE];

int32结果= vsnprintf (formatedMsg、
GCProtocol::MAX_LOG_MSG_STRING_SIZE、
格式、
args);
if (零<结果)

strLog = formatMsg;

va_end (args);/* TICS !OAL#015允许为空进行记录*/

返回 strLog;

我们使用上述函数进行 var arg 格式化  

在这种情况下,A2D 值在边界处波动,并使用%f 值(以 cm 为单位的位置,例如10.2)记录 InRange 和 outRange。 我们从两个任务中定期读取 A2D 计数值;由于波动、我们看到 InRange 和 outRange 定期获取日志。 在这种情况下、我们观察到堆栈溢出、如果我们删除了记录%f 值、则可以正常工作。 我们还有很多其他实例、我们使用%f 进行记录、但我们看不到任何问题。

BTW、我们不直接从 Tiva C 基板进行日志记录;我们的记录器实用程序会将字符串发送到支持日志记录的主板。

CCS - 901

编译器版本- TI v18.12.1.LTS

tirtos_tivac_2_16_00_08

有线索吗?

谢谢你。

Abhijit

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

    Abhijit、您好!  

    我知道该代码正在我们的 TM4C1294NCPDT 器件上执行、但我们是专门从事器件外设和功能使用的器件专家。 这个问题不在我们提供支持的范围内、因为它是一个常规 C 代码问题并且特定于应用。

    我可能会建议堆栈溢出? (虽然有时社区成员也可能会鸣叫...)

    此致、

    Ralph Jacobi

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

    您好 Ralph、

    感谢您的回答。 我可以理解、这可能与我们自己的应用相关、但我无法理解下面的问题

    1) 1)堆栈不会在第一次调用时溢出;我们看到、使用 正确的浮点变量值生成了少量日志

    2)为什么只有%f 会导致堆栈溢出;如果我们从日志中删除%f、则看不到问题。

    3)我们监视该特定任务的堆栈峰值;突然、它从~1300字节跳到~2000字节(2048是我们的堆栈大小)  

    谢谢、此致

    Abhijit

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

    Abhijit、您好!

    如果这种情况、我的理解甚至比您的理解更少。 我不像您那样使用日志记录、也不像 TM4C 器件专家那样使用%f。 很抱歉我无能为力。

    可能要尝试的一点是增加堆栈大小并查看堆栈峰是否未增加-那么这可能只是日志记录的成本。 如果达到新的堆栈大小、则很可能是内存泄漏。

    此致、

    Ralph Jacobi

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

    您好 Ralph、

    感谢您花时间作出响应。

    如果我们使用%.3f、我们还有一个观察结果、它运行正常;我们看不到堆栈溢出。

    您能否解释一下堆栈使用情况下的内存泄漏问题可能是什么?

    谢谢你。

    此致

    Abhijit

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

    尊敬的 Abhijit:

    我可能使用了错误的术语-内存泄漏似乎是 malloc 命令所特有的。 只是意味着堆栈溢出可能是由缓冲区大小问题引起的-如果缓冲区指针或缓冲区溢出、则它可以溢出到堆栈上。 这就是我的想法。

    此致、

    Ralph Jacobi

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

    > char formatMsg[GCProtocol::MAX_LOG_MSG_STRING_SIZE];

    >strLog = formatedMsg;

    > return strLog;

    此代码显示为返回悬空引用(指向局部变量的指针)。 根据您对结果所做的操作、这可能会导致 各种问题。

    [编辑:没关系。 我错过了此部分:

    >std ::字符串 FormatLogString (const char*格式,...)  

    ]

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

    好的、明白了。

    是的、我们看到如果我们 在变量参数字符串中使用%f、它会突然增加堆栈要求。 为什么会这样? 即使是%.2f 或%.3f 也不会降低堆栈要求。

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

    好的