Re: [問題] 如何追查可能因MutilThtread下stackover

看板C_and_CPP (C/C++)作者 (傳承與使命)時間1年前 (2023/08/03 00:36), 1年前編輯推噓1(102)
留言3則, 2人參與, 1年前最新討論串2/2 (看更多)
※ 引述《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://www.ptt.cc/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

08/03 10:17, 1年前 , 1F
認真好文,給推!
08/03 10:17, 1F
※ 編輯: jasonwu (111.249.93.245 臺灣), 08/03/2023 10:23:36

08/05 01:33, 1年前 , 2F
我是原PO 感謝大大分享 因為前些天較忙 所以沒有辦法來看
08/05 01:33, 2F

08/05 01:44, 1年前 , 3F
其實我之前改不同優化程度 發現thread會crash 在其他地方
08/05 01:44, 3F
文章代碼(AID): #1aoeOUxT (C_and_CPP)
文章代碼(AID): #1aoeOUxT (C_and_CPP)