[問題] 關於副程式呼叫
問題(Question):
在大型系統遇到了一些問題
有一個副程式A裡面做的事情是free動態記憶體
它的code就是傳入記憶體再把它free掉
所以很多function都有用到他
但有某個function寫錯了呼叫了A free了不該free的記憶體
有方法可以知道是哪個function呼叫了A嗎?
因為印出的log只有顯示死在A
很多function都沒加log, 因此完全看不到東西
但關鍵應該是呼叫的那個function傳的記憶體位置
老實說只想到在每個function呼叫A前都加個printf看看兇手是誰
但這樣有點像土法煉鋼
想知道有沒有更聰明的方法知道是哪個function呼叫的
感覺上應該是有方法的
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.66.108
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1479914917.A.5E9.html
→
11/23 23:33, , 1F
11/23 23:33, 1F
→
11/23 23:34, , 2F
11/23 23:34, 2F
推
11/23 23:40, , 3F
11/23 23:40, 3F
推
11/23 23:51, , 4F
11/23 23:51, 4F
→
11/23 23:52, , 5F
11/23 23:52, 5F
謝謝大家的回應
當時也有想過傳__FILE__ 和 __LINE__
但讓 A 多傳兩個參數, 感覺每個呼叫的A都要修改
這樣跟前面都加printf好像差不多
而Schottky 意思是像這樣嗎?
// 宣告一個macro 名稱為functionA
#define A(ptr) A2(ptr, __FILE__, __LINE__)
// 原function本體A修改名稱為A2並多傳兩個string
void A2 ( ptr, __FILE__, __LINE__ )
{
printf ( __FILE__, __LINE__ );
}
不知道有沒有誤會
※ 編輯: usanhuang (123.192.66.108), 11/24/2016 00:05:55
推
11/24 00:11, , 6F
11/24 00:11, 6F
→
11/24 00:11, , 7F
11/24 00:11, 7F
→
11/24 00:12, , 8F
11/24 00:12, 8F
謝謝各位
大致上了解了
但想到一個問題
這樣的作法等於是讓原本的副程式變為marco
假如有 extern void A ( void*);
這樣應該會有問題
但這邊應該就無法避掉了吧
只能硬修code了?
※ 編輯: usanhuang (123.192.66.108), 11/24/2016 00:27:29
→
11/24 00:41, , 9F
11/24 00:41, 9F
→
11/24 00:41, , 10F
11/24 00:41, 10F
→
11/24 00:42, , 11F
11/24 00:42, 11F
→
11/24 01:14, , 12F
11/24 01:14, 12F
推
11/24 01:18, , 13F
11/24 01:18, 13F
→
11/24 02:21, , 14F
11/24 02:21, 14F
→
11/24 02:22, , 15F
11/24 02:22, 15F
推
11/24 02:25, , 16F
11/24 02:25, 16F
→
11/24 10:33, , 17F
11/24 10:33, 17F
→
11/24 10:33, , 18F
11/24 10:33, 18F
→
11/24 10:36, , 19F
11/24 10:36, 19F
→
11/24 17:44, , 20F
11/24 17:44, 20F
→
11/24 17:45, , 21F
11/24 17:45, 21F
→
11/24 17:46, , 22F
11/24 17:46, 22F
→
11/24 17:46, , 23F
11/24 17:46, 23F
→
11/24 17:47, , 24F
11/24 17:47, 24F
推
11/24 22:49, , 25F
11/24 22:49, 25F
推
11/27 10:37, , 26F
11/27 10:37, 26F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章