FW: [請益] 如何追查可能因MutilThtread下stackover
※ [本文轉錄自 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
前面4個參數都被變成0
請問各位網友其會被修改到的原因
是不是因為Mutil thread 所造成 其值被其他thread StackOverflow 修改
但由於thread 眾多 各位網友是不是有甚麼的方式或tool
能介紹給我 去debug 找出是哪個thread 哪段code 所造成
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.107.225 (臺灣)
※ 文章網址: https://www.ptt.cc/C_and_CPP/E.-87yjjdbjYkY
你都有bt, 怎麼不先看看caller的植是不是對的?
上面所講的值 u4IfIndex=43 , u1AdminStatus=1 就是由 gdb print 印出來的
用 Valgrind 自己查啊
試試"hardware" watchpoint?
比較簡單的就是你觀察一下這函式內有沒有呼叫完某個子程式回
來之後,值就跑掉,可能是裡頭有問題
基本上 pu1InOperStatus這是pointer pu1InOperStatus=0x0(null) API 用到它 整隻程式就 crash了
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 16:08:58還是沒辦法的話,開發環境許可的話,把編譯器警告打開,修一修..
我的意思是函式執行到一半,發現原本參數被改了,但如果你的意
思是一進入函式,參數就錯了.. 那我一時想不到其他簡單的建議
可以用gdb裡 "watch"這個command可看是誰改了variable值
google一下gdb watch variable,就可以看到一些介紹了
難點 要監看是local variable 進入API後來才能監看
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 17:29:20有碰哪些變數的地方都寫Log?總會找到哪裡改掉那些值
沒有signature, 你全部都pass by ref/ptr?
u4IfIndex不是是傳入的參數嗎?怎麼是local variaable?
其實上層有個變數 也叫u4IfIndex 和API 宣告的參數名字也叫u4IfIndex 上層 變數 u4IfIndex 的值是沒被改到 但API裡變數u4IfIndex的值被改到 目前 其實是這樣認為的 "原本thread 在進入 function,cpu 因context switch 換到其他的thread 而這個thread buff 沒有處理好 Overflow 蓋掉原本thread 的 stack buff"
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 19:27:24所以你傳入的前四個參數到底是global variables還是只是上
層的local variables?上層的參數是static嗎?
無法watch那就手動將每個會碰到這些參數的thread都埋log吧
懷疑被overflow攻擊,可以用ASan試試,另外,如果你是
arm/x64,前幾個參數是放在register,就不可能被攻擊
到,就要往其他方向想,x86才會放stack
放register也是會炸啊,跳進子函式把stack搞爛,跳出來pop reg
就會得到非預期的東西...
開 asan 下去跑吧,重 build 麻煩了一點
不介意速度的話 valgrind 掛上去跑找看看存取越界
感謝C_C++版的 LPH66 給提示的 後來我開始推測可能是進入API後 前面4個變數給記憶體位置可能是不可寫入 也就說從頭到位 變數的值未被修改過 也沒有被其他thread 修改 從一開始進入這個API 就產生segment fault
https://upload.cc/i1/2023/07/24/oJ6wfn.jpg
u4IfIndex 的記憶體位置 是 0xaa303f9c 查看 thread map
https://upload.cc/i1/2023/07/24/2bNjEW.jpghttps://upload.cc/i1/2023/07/24/Bf2Mkn.jpg
右上圖圈選 得知 0xaa303f9 的確在不可存取記憶空間 目前推測會造成這樣原因 因為我們code 分成三個部分 在build 可能帶的最佳化選項 -O 後面數字都不一樣所造成
※ 編輯: tanted (106.1.107.225 臺灣), 07/24/2023 21:59:37我是針對他說傳進去的參數被改掉
54
[閒聊] AMD 近期歷代名稱及架構整理Socket AM4 (封裝類型:PGA / 腳針:1331 pin) AMD A-Series APU Processors系列 (Desktop) 架構:Excavator(代號:Bristol Ridge) 製程:GlobalFoundries 28nm 記憶體類型:DDR4(Dual-channel)20
[情報] [AMD大降價] 3900X 降幅25%,其他Ryzen都[AMD大降價] 3900X 降幅25%,其他Ryzen都有降 美国ww.microcenter.com网站,3900X降幅的降幅达到了25%,现在只需要449美元 AMD Ryzen 9 3950X 16 Core / 32 Thread CPU- $729.99 US (原价$749.99US) AMD Ryzen 9 3900X 12 Core / 24 Thread CPU - $449.99 US (原价 $599.99US) AMD Ryzen 7 3800X 8 Core / 16 Thread CPU - $299.99 US (原价 $399.99 US)13
Re: [問卦] C++到底難學在哪裡: 因為C++有太多一不小心就會出事的細節。 舉個常見的例子: 今天有個vector<T> 你從vector拿T&出來用的同時,另外一條thread正在push_back到vector裡,碰巧觸發vec12
[黑特] 賴清德的Thread 開了 大家快跟上ㄌㄨㄚˋ清德的thread 開了 目前2746個跟隨者 各位 新戰場出現了9
[問卦] multi-thread真的很難嗎?本魯待業資訊肥宅 記得第一份工作的第一個project 就是修改code 要利用到multi-thread 當時一頭霧水6
Re: [請益] 有用過多執行緒做工具嗎這個很easy的 有沒有聽過DirectX12 有沒有聽過3D Rendering? 現在渲染指令都是multithreaded baking惹 還在一個thread遊戲邏輯一個thread負責渲染已經遜掉了 現在大學生只要修過電腦繪圖學的都知道怎麼做command list4
Re: [討論] 用AI寫code產生的疑問AI(GPT)用於Coding的實務心得 作者是虎尾科大資工系陳國益教授,經同意後轉載文字內容,原連結於下: 在上週前往華新麗華授課時,有工程師問到:若有要接手的大型專案,應如何透過AI協助 ,加速對專案的理解速度,或是快速產生手冊、API列表等,傳統上要花非常多時間交互4
[問卦] Thread 多久會過氣?晚上下班看手機 發現怎麼一堆加入Thread 什麼的 才發現是新的APP 但看一看就是一堆生活廢文 而且又不像哀居有圖片影片1
[問卦] thread 就是fb版的八卦版吧一堆陌生人的文章 都是廢文 每個人都能看到 我說thread就是fb版的八卦版對吧 -----X
[問卦] 在ptt發廢文是不是比thread好玩?不太懂用thread幹嘛不用fb? 兩者除了介面不同用途好像沒什麼差別 甚至功能還很陽春 一堆人跑去threads發廢文是什麼概念? ptt發廢文有趣多了吧