亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 7137 | 回復(fù): 10
打印 上一主題 下一主題

[函數(shù)] 關(guān)于在運(yùn)行時(shí)“怎么知道自己寫的c函數(shù)正在被那些函數(shù)調(diào)用?”的問題。 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-05-08 22:00 |只看該作者 |倒序?yàn)g覽
偶爾重讀“精靈進(jìn)程”于2007年1月24日發(fā)的帖子,看到大家對他的第一個(gè)問題還沒有什么明確的答案,就在這里說一下我的方法,不一定是最好的,大家共同學(xué)習(xí)。
原題是這樣的:
1。怎么知道自己寫的c函數(shù)正在被那些函數(shù)調(diào)用?請說明方法。

我估計(jì)面試官的本意是,如何設(shè)計(jì)你的函數(shù)(called 函數(shù)和calling 函數(shù)),使得這個(gè)函數(shù)可以知道是誰在調(diào)用它, 這么做的目的是為了便于debug。

我的方法其實(shí)很簡單,就是在每個(gè)函數(shù)的參數(shù)列表加上兩個(gè)參數(shù),一個(gè)是文件名,一個(gè)是行號, 如:
void myFunction1 (int var1, int var2, ... , char *file, int line )

然后在每個(gè)需要調(diào)用 myFunction1 的地方, 比如 myFunction2 內(nèi)調(diào)用 myFunction1, 使用如下方式調(diào)用:
void myFunction2 () {
   ....
   myFunction1(a, b, ... , __FILE__, __LINE__ ); // 調(diào)用時(shí),編譯器會自動把當(dāng)前的文件名和行號填入作為參數(shù)。
   ....
}

這樣在myFunction1 內(nèi)就能*實(shí)時(shí)*的知道是那個(gè)函數(shù)在調(diào)用它,因?yàn)槲覀冎懒宋募托刑,就可以唯一定位到某個(gè)函數(shù)內(nèi)。

如我所述,這不一定是最好的方法,但起碼可以達(dá)到目的。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2007-05-08 22:04 |只看該作者
不錯。這是種思路。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2007-05-08 22:16 |只看該作者
這種方法用一個(gè) 宏就可以了, 可跟蹤任何函數(shù),不需要改函數(shù)定義。
void myFunction1(......)
#define DEBUG_MY_FUNCTION 1
#if DEBUG_MY_FUNCTION
#define CALL_MY_FUNCTION debug("called at %s:%d %s\n", __FILE__,__LINE__,__FUNCTION__); myFunction1
#else
#define CALL_MY_FUNCTION myFunction1
#endif

程序中用CALL_MY_FUNCTION替代myFunction1即可。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2007-05-08 22:30 |只看該作者
謝謝你的回復(fù),使用宏是一個(gè)不錯的選擇,起碼不需要對myFunction1的參數(shù)進(jìn)行修改。

但是在有一些應(yīng)用中,宏卻無能為力。
很多時(shí)候,我們需要記錄每一個(gè)對此函數(shù)調(diào)用的文件名,行號,為了在程序出錯時(shí)(或者core dump)進(jìn)行調(diào)試。使用宏能夠?qū)崟r(shí)的把每一次調(diào)用打印出來,但是不能體現(xiàn)出根細(xì)節(jié)的信息。比如當(dāng)在函數(shù)myFunction1 中做某些“關(guān)鍵”操作時(shí),比如操作hash table,刪掉一個(gè)記錄,或者增加一個(gè)記錄,刪除的時(shí)候,我們同時(shí)產(chǎn)生一個(gè)刪除條目,用于記錄是誰刪除的該條記錄(即調(diào)用函數(shù)所在文件和行號),以便于日后出現(xiàn)問題的時(shí)候能夠很快的debug出來。

使用宏和能夠很優(yōu)雅的解決問題,同時(shí)也喪失了一些靈活性。

再次感謝你的回復(fù)~

原帖由 connet 于 2007-5-8 22:16 發(fā)表
這種方法用一個(gè) 宏就可以了, 可跟蹤任何函數(shù),不需要改函數(shù)定義。
void myFunction1(......)
#define DEBUG_MY_FUNCTION 1
#if DEBUG_MY_FUNCTION
#define CALL_MY_FUNCTION debug("called at %s:%d %s ...

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2007-05-09 08:52 |只看該作者
不錯

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2007-05-09 09:20 |只看該作者
這個(gè)思路確實(shí)好,配合define,分別生成debug版和release版的函數(shù),確實(shí)方便

  1. fun(arg)

  2. #ifdef debug
  3. #define Fun(arg)    Fun_debug(arg,__FILE__,__LINE__,__FUNCTION__)
  4. #else
  5. #define Fun(arg)    Fun_release(arg)
  6. #endif

  7. #define Fun_release(arg)    fun(arg);
  8. #define Fun_debug(arg,__FILE__,__LINE__,__FUNCTION__)   \
  9.          printf("%s,%s,%s",__FILE__,__LINE__,__FUNCTION__ );fun(arg);

復(fù)制代碼

[ 本帖最后由 net_robber 于 2007-5-9 09:22 編輯 ]

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2007-05-09 09:27 |只看該作者
gcc的__builtin_return_address有沒有用?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2007-05-09 09:40 |只看該作者
樓上,偶沒有用過這個(gè),馬上查一下,呵呵

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2007-05-09 10:00 |只看該作者
那個(gè)返回的不是字符串啊

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2007-05-09 10:23 |只看該作者

回復(fù) 9樓 net_robber 的帖子

嗯, 只是個(gè)地址值
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP