问题(Question):
在大型系统遇到了一些问题
有一个副程式A里面做的事情是free动态内存
它的code就是传入内存再把它free掉
所以很多function都有用到他
但有某个function写错了呼叫了A free了不该free的内存
有方法可以知道是哪个function呼叫了A吗?
因为印出的log只有显示死在A
很多function都没加log, 因此完全看不到东西
但关键应该是呼叫的那个function传的内存位置
老实说只想到在每个function呼叫A前都加个printf看看凶手是谁
但这样有点像土法炼钢
想知道有没有更聪明的方法知道是哪个function呼叫的
感觉上应该是有方法的
谢谢大家
我的方法是写 Macro 把 __FILE__ 和 __LINE__ 传进来再把这两项加入此 function 的 log 印出来就行了
作者:
LPH66 (-6.2598534e+18f)
2016-11-23 23:51:00一楼的方法其实就是自动化你所想到的方法如果拿不到 stack trace 的话这不失为一个好方法差不多, 不过函数本身一般参数即可, __FILE__ 用 char* 接__LINE__ 用 int 接函数的参数名自己另外订, 不能直接用 __FILE__ __LINE__
extern 一般会集中在 header 吧,只需要改一次如果同一个 function 的 extern 散落各处,趁这机会修理否则现在不出事,将来若改到 prototype 一样会出事
作者:
firejox (Tangent)
2016-11-24 01:14:00我习惯会用#直接把macro 转字串如果有支援c99的话 也可以用__func___
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2016-11-24 02:21:00如果是 glibc 的话直接 backtrace() 印出来就好了Windows API 似乎也有 stack inspection 但我是没用过
作者:
LPH66 (-6.2598534e+18f)
2016-11-24 02:25:00所以我前面就提了拿不到 stack trace 再说, 不然找那个最快
如果在副程式中把ESP存起来呢?这样就知道最后是谁CALL的不是ESP,把call retn的stack返回地址存起来
作者:
LPH66 (-6.2598534e+18f)
2016-11-24 17:44:00这其实就是 stack trace 实际上是怎么追出来的方法配合除错资讯中哪里到哪里是哪个函式就能建构出 trace 了但一般程式是不容易抓到这个地方的, 除非对环境很了解(ie. 能知道要怎么去找到这个返回地址)所以这种东西多半是 runtime 才会/才能提供
作者:
flyfoxy (飞狐)
2016-11-27 10:37:00dump file 然后用工具看call stack