Re: [問題] 如何追查可能因MutilThtread下stackover
※ 引述《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
08/05 01:33, 2F
→
08/05 01:44,
1年前
, 3F
08/05 01:44, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章