[問題] 如何追查可能因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