作者jasonwu (传承与使命)
看板C_and_CPP
标题Re: [问题] 如何追查可能因MutilThtread下stackover
时间Thu Aug 3 00:36:40 2023
※ 引述《tanted (为何世界会那麽不单纯)》之铭言:
: 标题: [问题] 如何追查可能因MutilThtread下stackover
: 时间: Sun Jul 23 14:45:15 2023
:
: 问题(Question):
: 传入参数被莫名的修改
:
: 某个API 如下
: CfaIfmNotifyInterfacStat (u4IfIndex, u1AdminStatus,
: &u1OperStatus, u1IsFromMib,
: u1IsRegToIp,
: &IfInfo)) != CFA_SUCCESS)
:
: 传入时的值:
: u4IfIndex=43 , u1AdminStatus=1, &u1OperStatus=(UINT1 *) 0xb1e0256f
:
: 进入API後值却变成
: https://upload.cc/i1/2023/07/23/ZnvhDF.jpg
: u4IfIndex=0, u1AdminStatus=0 , pu1InOperStatus=0x0,
: 前面4个参数都被变成0
:
: 请问各位网友其会被修改到的原因
: 是不是因为Mutil thread 所造成 其值被其他thread StackOverflow 修改
: 但由於thread 众多 各位网友是不是有甚麽的方式或tool
: 能介绍给我 去debug 找出是哪个thread 哪段code 所造成
: 谢谢
[deleted]
: --
: 推 LPH66: 那我觉得最佳化等级的影响可能会更大 07/24 01:41
: → LPH66: 或者是上面说的 gdb 没使用对的呼叫惯例去找参数 07/24 01:41
: → LPH66: 每个 thread 会有他自己的 stack, 如果因为堆叠溢位写到了 07/24 01:43
: → LPH66: 其他 thread 的 stack, 那它其实已经盖掉更多东西了 07/24 01:43
: → LPH66: 几乎不可能到了切过去时才会当掉 07/24 01:44
: → LPH66: (如果真盖掉更多东西, 很高机会会在盖掉後不久当掉) 07/24 01:44
: → LPH66: 你还是把最佳化选项 (-O3 等) 拔掉後再跑跑看 07/24 01:45
[deleted]
: 是toolchain 出了问题造成的吗
: toolchain 为 toolchain-arm_cortex-a9+vfpv3-d16_gcc-8.4.0_glibc_eabi
: 或是编译时gcc设定参数有关吗
[deleted]
: 前四个参数值不一样,但後面两个参数跟上层引数是一样的。
依你用的toolchain来说,
前四个参数应该是放在 registers: r0, r1, r2, r3,
第五个参数开始会往stack塞,给下一个function取用。
而下一个function也会依序从 r0, r1, r2, r3, stack ... 的方式拿取参数。
至於下一个function会不会在拿取 r0-r3 的参数时也将其放进 stack?
看情况,这要依优化程度和程式码复杂度而定。
你说第五个参数後的资料是对的,那stack应该没什麽问题。
正如前一篇推文中的LPH66网友所说,真要盖掉的话其实很多东西早被盖掉了。
比较担心的是可能有 undefined behavior 或是 non-thread-safe 的 code,
然後你 compiler option 又有下相当程度的优化
(e.g. O2 / Ofast / -fstrict-aliasing / -finline-functions...),
这种情况下 r0-r3 会被优化成什麽样子,
甚至传给下一个 function 时又会发生什麽变化,都是难以预料的。
举例来说你本来想写一段 pooling 的 code
目的是想等 flag 所指到的记忆体内容被其它 thread or process 设为 1 後
再继续往下走,於是你写了:
// loop until *flag != 0
while(*flag == 0);
// do something...
但你会发现 compiler 优化一开下去,
那个 while loop 会永远处在 infinite loop。
等到你 compiler 用 -S 细看 assembly code 後,
你才知道原来那个 while 被翻成了类似 "b ." 这个永远跳到自己的指令行为.
所以我建议先要求所有的 code 先用 -O0 -g3 去 build,
过程中要小心 gcc compiler option 的基本原则是:
"-Ox 是套餐; -fxxx 是单点"
"同层级的优化选项 後面盖掉前面" (e.g. gcc -O0 -g3 -O2 等价 gcc -g3 -O2)
"不同层级的优化选项 -fxxx 会压过 -Ox 的套餐设定"
试着调整一下你的makefile或是project设定後重新编译跑跑看吧。
甚至也建议用 -S 来让 compiler 来产生 assembly code,
然後认真检视一下是不是在传参数时发生了什麽意料之外的行为。
祝 debug 顺利。 :)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.249.78.174 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1690994206.A.EDD.html
※ 编辑: jasonwu (111.249.78.174 台湾), 08/03/2023 00:43:21
※ 编辑: jasonwu (111.249.78.174 台湾), 08/03/2023 00:44:12
1F:推 jheli: 认真好文,给推! 08/03 10:17
※ 编辑: jasonwu (111.249.93.245 台湾), 08/03/2023 10:23:36
2F:→ tanted: 我是原PO 感谢大大分享 因为前些天较忙 所以没有办法来看 08/05 01:33
3F:→ tanted: 其实我之前改不同优化程度 发现thread会crash 在其他地方 08/05 01:44
4F:推 v86861062: 推推 08/08 12:16
5F:→ leolarrel: 照你这样讲起来,我觉得是蛮有可能是volatile问题方面 08/16 18:52