請問子函數有辦法知道是被那個父函數所呼叫嗎? |
答題得分者是:Jasonwong
|
mypigbaby
高階會員 發表:11 回覆:168 積分:155 註冊:2006-07-20 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
您是要 DEBUG 用嗎 ?? 我也遇到類似的困擾,
我以前的做法 AA(),BB(),CC() ....PROCEDURE 或 FUNCTION 要 呼叫共用函數 HH() 法1 : 直接傳入引數 AA--> HH( 'AA' ) , BB-->HH( 'BB') , CC-->( 'CC') 法2: 共用變數 var sName : string; ------- FUNCTION AA() OR PROCEDURE AA() begin sName := 'AA'; ...... HH(); end; FUNCTION HH() OR PROCEDURE HH() begin showmessage( sName ); end; 法 3 : AA,BB,CC 的函數名稱自動取出(忘記那函數?? )..取代 法1,2 的給值方法
------
--------------------------------------- 偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩. |
mypigbaby
高階會員 發表:11 回覆:168 積分:155 註冊:2006-07-20 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
前輩不敢當,時常有這樣感觸,對技術越學習越覺得自己的渺小與無知,或許就是古人所云「學,然後知不足」吧。
當然我們想要的就是那個神祕函數,只需要寫在被呼叫的那"一個"共用函數即可,上百個呼叫者是不用改的。 提供一個站上找到一樣問題的地方參考 http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=92658 ===================引 用 ANDY8C 文 章=================== TWY 前輩 您好: 我的方法還是要 改 SOURCE , 例如 : 在 HH() 內加入該函數, 就可以知道 上一層是誰來呼叫 HH() 那神秘的函數,我會翻一下 早期 的程式,看能否找到....... |
Jasonwong
版主 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
|
mypigbaby
高階會員 發表:11 回覆:168 積分:155 註冊:2006-07-20 發送簡訊給我 |
|
Jasonwong
版主 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
我大約查了一下, 你們所要的功能名稱叫做 procedure call stack
由 A procedure 去 call B procedure 的話, 因為 B procedure 執行完後必須跳回 A procedure 所以在流程上就必須記錄 A procedure 的一些必要資訊, 而這些資訊就是放在 stack 上 我找到的這個網址就是在實作這個技術 ===================引 用 mypigbaby 文 章=================== 謝謝您的link 但是還是看不懂那個在寫什麼>"< ===================引 用 Jasonwong 文 章=================== http://edn.embarcadero.com/article/30115 希望這個網址能對你有幫助
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心 |
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
===================引 用 mypigbaby 文 章=================== 目前是希望在不修改 SOURCE CODE的前提下(只要重新COMPILE) 看出是由那支程式所呼叫 如果前提是都不改caller,那麼也就表示該function的parameters是不能變動的。那麼我很肯定的說… 這是一個無解的題目! 我經常破解軟體,也就是說經常反組譯,就我的了解來說,這樣的條件最多僅可以找到是 哪個 指標(pointer)呼叫了它。其方法就是在stack上找到呼叫者的位址,詳情需要了解組合語言。但,就算找到了指標,你也只能統計出,從哪個位址呼叫函式的次數,但這似乎幫助不大。 我想,我們需要了解,當compiler後,所有的函式名其實都已無意義,通通會被轉成記憶體的位址,連os也不會去維護它(debug模式除外,還有dll中被import/export的函式也除外)。於是,除非自己刻意的在函式的caller的地方做手腳,在呼前寫入記錄,或把函式加入一個"記號 "的參數,由呼叫者傳入。這二種方法,Andy8c的都有提了。 所以,結論,雖然未能正面的解答你的問題,但告訴你不可能後,你便也可以不用花太多的時間走冤枉的路了!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
難度頗高
1. 目前可以經由 stack 撈到呼叫點 2. 可以使用 RTTI 與 VCL 的記憶體配置方式的相關知識,撈到相關的配置區間,可能要進一步分析 3. 比對落在那個區間 An address between a function's start and ret point. 或許可行 如果是單純的函式 (not method),就必須自己建立文字與位址的表格,因為這些資訊,僅存在設計時期 如果設計時期不去處理,編譯後,都只剩下位址的關係 ===================引 用 mypigbaby 文 章=================== 目前是希望在不修改 SOURCE CODE的前提下(只要重新COMPILE) 看出是由那支程式所呼叫 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |