作者:
tanted (為何世界會那麼不單純)
2023-07-23 14:55:45※ [本文轉錄自 C_and_CPP 看板 #1alCn-OQ ]
作者: tanted (為何世界會那麼不單純) 看板: C_and_CPP
標題: [問題] 如何追查可能因MutilThtread下stackover
時間: Sun Jul 23 14:45:15 2023
開發平台(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 所造成
謝謝
作者:
wulouise (在線上!=在電腦前)
2023-07-23 15:02:00你都有bt, 怎麼不先看看caller的植是不是對的?
作者:
loadingN (sarsaparilla)
2023-07-23 15:04:00用 Valgrind 自己查啊
作者:
kokal (細菌)
2023-07-23 15:32:00試試"hardware" watchpoint?
作者:
xam (聽說)
2023-07-23 16:00:00比較簡單的就是你觀察一下這函式內有沒有呼叫完某個子程式回來之後,值就跑掉,可能是裡頭有問題還是沒辦法的話,開發環境許可的話,把編譯器警告打開,修一修..
作者: RafaelC (愛看pili) 2023-07-23 16:48:00
可以用gdb裡 "watch"這個command可看是誰改了variable值google一下gdb watch variable,就可以看到一些介紹了
作者: aa06697 (todo se andarà) 2023-07-23 18:54:00
有碰哪些變數的地方都寫Log?總會找到哪裡改掉那些值
作者:
wulouise (在線上!=在電腦前)
2023-07-23 18:56:00沒有signature, 你全部都pass by ref/ptr?
作者: RafaelC (愛看pili) 2023-07-23 18:59:00
u4IfIndex不是是傳入的參數嗎?怎麼是local variaable?
作者: jheli (我是企鵝) 2023-07-24 00:54:00
所以你傳入的前四個參數到底是global variables還是只是上層的local variables?上層的參數是static嗎?無法watch那就手動將每個會碰到這些參數的thread都埋log吧
作者: wendly777 (小水) 2023-07-24 19:35:00
懷疑被overflow攻擊,可以用ASan試試,另外,如果你是arm/x64,前幾個參數是放在register,就不可能被攻擊到,就要往其他方向想,x86才會放stack
作者:
xam (聽說)
2023-07-24 21:18:00放register也是會炸啊,跳進子函式把stack搞爛,跳出來pop reg就會得到非預期的東西...
開 asan 下去跑吧,重 build 麻煩了一點不介意速度的話 valgrind 掛上去跑找看看存取越界
作者: wendly777 (小水) 2023-07-24 22:00:00
我是針對他說傳進去的參數被改掉