[問題] 如何追查可能因MutilThtread下stackover
看板C_and_CPP (C/C++)作者tanted (為何世界會那麼不單純)時間1年前 (2023/07/23 14:45)推噓11(11推 0噓 35→)留言46則, 9人參與討論串1/2 (看更多)
開發平台(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 所造成
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.107.225 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1690094718.A.61A.html
※ tanted:轉錄至看板 Soft_Job 07/23 14:55
推
07/23 15:39,
1年前
, 1F
07/23 15:39, 1F
推
07/23 17:23,
1年前
, 2F
07/23 17:23, 2F
推
07/23 22:41,
1年前
, 3F
07/23 22:41, 3F
→
07/23 22:42,
1年前
, 4F
07/23 22:42, 4F
→
07/23 22:51,
1年前
, 5F
07/23 22:51, 5F
→
07/23 22:51,
1年前
, 6F
07/23 22:51, 6F
→
07/23 22:54,
1年前
, 7F
07/23 22:54, 7F
其實這不是及時gdb的抓取的,這是因為程式crash後,產生了core dump,用gdb去看
的,而程式為什麼crash,最主要原因pu1InOperStatus=0x0 ,因為這是個pointer,而code
對它做指向操作造成segment fault。
只錯前四個是因為我發現到前四個的參數的存放記憶位置是連續,但第5個的記憶體位置
和前4個不是連續的。
目前 其實是這樣認為的
"原本thread 在進入 API,cpu 因context switch 換到其他的thread
而這個thread buff 沒有處理好 Overflow 蓋掉原本thread 的 stack buff"
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 23:40:33
推
07/24 01:41,
1年前
, 8F
07/24 01:41, 8F
→
07/24 01:41,
1年前
, 9F
07/24 01:41, 9F
→
07/24 01:43,
1年前
, 10F
07/24 01:43, 10F
→
07/24 01:43,
1年前
, 11F
07/24 01:43, 11F
→
07/24 01:44,
1年前
, 12F
07/24 01:44, 12F
→
07/24 01:44,
1年前
, 13F
07/24 01:44, 13F
→
07/24 01:45,
1年前
, 14F
07/24 01:45, 14F
推
07/24 09:09,
1年前
, 15F
07/24 09:09, 15F
→
07/24 09:09,
1年前
, 16F
07/24 09:09, 16F
感謝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.jpg
右上圖圈選 得知 0xaa303f9 的確在不可存取記憶空間
目前推測會造成這樣原因
因為我們code 分成三個部分 在build
可能帶的最佳化選項 -O 後面數字都不一樣所造成
※ 編輯: tanted (106.1.107.225 臺灣), 07/24/2023 21:58:16
→
07/28 14:29,
1年前
, 17F
07/28 14:29, 17F
→
07/28 14:30,
1年前
, 18F
07/28 14:30, 18F
→
07/28 23:02,
1年前
, 19F
07/28 23:02, 19F
其實目前這個issue 尚未解掉 但可以避掉 因為那是讓user telnet 進來執行
才creat 出來thread ,如果一次只執行一個thread 就是只讓一個user進來
就不會有這種情形,如果此時再讓第二個user 進來 ,此時creat 出來thread
就會有這種情形。
※ 編輯: tanted (106.1.107.225 臺灣), 07/29/2023 13:37:44
推
07/29 17:03,
1年前
, 20F
07/29 17:03, 20F
→
07/29 17:17,
1年前
, 21F
07/29 17:17, 21F
→
07/29 17:17,
1年前
, 22F
07/29 17:17, 22F
我想目前這跟 gdb 或如何trace無關了
為何local stack variable 會被賦一個"不可存取的記憶位置"
是toolchain 出了問題造成的嗎
toolchain 為 toolchain-arm_cortex-a9+vfpv3-d16_gcc-8.4.0_glibc_eabi
或是編譯時gcc設定參數有關嗎
※ 編輯: tanted (106.1.107.225 臺灣), 07/29/2023 18:23:17
→
07/29 18:40,
1年前
, 23F
07/29 18:40, 23F
→
07/29 18:40,
1年前
, 24F
07/29 18:40, 24F
推
07/29 19:05,
1年前
, 25F
07/29 19:05, 25F
推
07/29 19:10,
1年前
, 26F
07/29 19:10, 26F
這四個變數是API的參數,所以一進去API 他就會被賦予上層傳給他引數值,
所以不可能是未初始化變數,但觀察上層引數卻跟傳下來
前四個參數值不一樣,但後面兩個參數跟上層引數是一樣的。
前四個參數值都變成0,一開始我以為可能被其他thread 類似做memset()
可能使用長度過長導致越界去修改到這個thread 堆疊記憶體導致變成0。
後來經過LPH66 提示,他認為不可能是stackoverflow 造成。
加上我使用GDB trace 使用step 進入這個API 就出現segment fault的訊息出來
讓我開始懷疑可能是被給了不可寫入memory address
我上面貼圖 已經很明顯 看到第一個參數的memory address 是在不可存取區間
而第5個參數是在可寫入memory address,所以他和上層傳來引數是相同
但為什麼會前四個參數的memory address會被賦予在不可存取區間
我目前不得而知
※ 編輯: tanted (106.1.107.225 臺灣), 07/29/2023 20:29:13
推
07/29 20:31,
1年前
, 27F
07/29 20:31, 27F
推
07/29 20:32,
1年前
, 28F
07/29 20:32, 28F
→
07/29 20:33,
1年前
, 29F
07/29 20:33, 29F
→
07/29 20:34,
1年前
, 30F
07/29 20:34, 30F
→
07/29 20:35,
1年前
, 31F
07/29 20:35, 31F
→
07/29 20:37,
1年前
, 32F
07/29 20:37, 32F
→
07/29 20:37,
1年前
, 33F
07/29 20:37, 33F
→
07/29 20:39,
1年前
, 34F
07/29 20:39, 34F
→
07/29 20:41,
1年前
, 35F
07/29 20:41, 35F
→
07/29 20:42,
1年前
, 36F
07/29 20:42, 36F
推
07/30 12:08,
1年前
, 37F
07/30 12:08, 37F
→
07/30 12:08,
1年前
, 38F
07/30 12:08, 38F
→
07/30 12:08,
1年前
, 39F
07/30 12:08, 39F
→
07/30 12:08,
1年前
, 40F
07/30 12:08, 40F
→
07/31 14:17,
1年前
, 41F
07/31 14:17, 41F
→
07/31 14:18,
1年前
, 42F
07/31 14:18, 42F
→
07/31 14:19,
1年前
, 43F
07/31 14:19, 43F
→
07/31 14:20,
1年前
, 44F
07/31 14:20, 44F
→
07/31 14:21,
1年前
, 45F
07/31 14:21, 45F
→
07/31 14:21,
1年前
, 46F
07/31 14:21, 46F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章