[问题] 如何追查可能因MutilThtread下stackover

楼主: tanted (为何世界会那么不单纯)   2023-07-23 14:45:15
开发平台(Platform): (Ex: Win10, Linux, ...)
linux openwrt
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(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 所造成
谢谢
作者: stupid0319 (征女友)   2023-07-23 15:39:00
thread很固定的改到别的thread的stack,见鬼了
作者: LPH66 (-6.2598534e+18f)   2023-07-23 17:23:00
你有取消最佳化参数后再去尝试除错过吗?
作者: seanwu (海恩)   2023-07-23 22:41:00
只错前四个的话,我感觉比较像gdb抓参数抓错,自己照calling convention对一下参数值有没有变然后没记错的话,gdb默认应该是all-stop mode,所有thread都会停下来才对真的要抓,如果支援的话可以试试看watchpoints
作者: LPH66 (-6.2598534e+18f)   2023-07-24 01:41:00
那我觉得最佳化等级的影响可能会更大或者是上面说的 gdb 没使用对的呼叫惯例去找参数每个 thread 会有他自己的 stack, 如果因为堆叠溢位写到了其他 thread 的 stack, 那它其实已经盖掉更多东西了几乎不可能到了切过去时才会当掉(如果真盖掉更多东西, 很高机会会在盖掉后不久当掉)你还是把最佳化选项 (-O3 等) 拔掉后再跑跑看
作者: descent (“雄辩是银,沉默是金”)   2023-07-24 09:09:00
pthread_attr_setstackaddr 用这个设定不同的 stack addr看看是不是一样有这问题
作者: leolarrel (真.粽子无双)   2023-07-28 14:29:00
用gdb , or gcc 编译加上-fsanitize=address,or 用Valgrind等工具探查内存
作者: Lipraxde (Lipraxde)   2023-07-28 23:02:00
加 compile option 前要先对好环境,不然会很痛苦喔XDD
作者: stupid0319 (征女友)   2023-07-29 17:03:00
createhttps://www.gdbgui.com/trace 看看写code写到怀疑toolchain还是gcc有问题的9成9都是低级bug造成
作者: b0920075 (Void)   2023-07-29 19:05:00
不能直接watch那个地址吗怎么看你描述只是未初始化变量
作者: lc85301 (pomelocandy)   2023-07-29 20:31:00
我觉得这个问题没那么简单,看你能不能丢完整 code 出来不能的话大家只能给你一点想法,剩下的靠通灵另外这个函数我去查也只有你的文章,不是通用的函式
楼主: tanted (为何世界会那么不单纯)   2023-07-29 20:34:00
因为这不是opensource Code 不能随意放出来
作者: lc85301 (pomelocandy)   2023-07-29 20:35:00
看你的 toolchain 跟 openwrt 应该是在开发嵌入式系统
作者: Lipraxde (Lipraxde)   2023-07-29 20:37:00
如果是自己刻的话,有没有可能是 thread 的实作有问题,传 stack 的时候没对好 ABI?
作者: lc85301 (pomelocandy)   2023-07-29 20:39:00
我个人通灵的话,我会在进去函数的引数的位址设 watch另外你描述方法让我联想到这篇古早的文章:http://unitytaiwan.blogspot.com/2016/05/2.html
作者: b0920075 (Void)   2023-07-30 12:08:00
如果你很确定是multithread在搞何不用 set scheduler-locking on 之类看看不让thread切换会不会出问题?虽然不知道用不同优化选项有没有差但能用sanitizer 或是rr应该有帮助
作者: descent (“雄辩是银,沉默是金”)   2023-07-31 14:17:00
如果确定是在 stack 的变量, 那和编译器无关这是在程式加载时, sp 被设定了这个位址gcc 产生的 code 只是在当时 sp 指到的地方存取这些变量你还是可以试试 pthread_attr_setstackaddr,把 thread stack 换成 malloc 出来的, 应该就不会在aa3 开头的区域, 可能可以避开这问题。
作者: leolarrel (真.粽子无双)   2023-08-16 18:51:00
认同stupid0319.会怀疑toolchain,我认为是还没抓到自己的问题
作者: sunneo (艾斯寇德)   2023-08-19 18:07:00
也有可能是pthread_create传入的closure的生命周期结束

Links booklink

Contact Us: admin [ a t ] ucptt.com