楼主:
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 所造成
谢谢
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:00pthread_attr_setstackaddr 用这个设定不同的 stack addr看看是不是一样有这问题
用gdb , or gcc 编译加上-fsanitize=address,or 用Valgrind等工具探查内存
作者:
Lipraxde (Lipraxde)
2023-07-28 23:02:00加 compile option 前要先对好环境,不然会很痛苦喔XDD
不能直接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?
如果你很确定是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 开头的区域, 可能可以避开这问题。
认同stupid0319.会怀疑toolchain,我认为是还没抓到自己的问题
作者:
sunneo (艾斯寇德)
2023-08-19 18:07:00也有可能是pthread_create传入的closure的生命周期结束