[問題] main 前執行之函式?(已解決)

看板C_and_CPP (C/C++)作者 (藍影)時間14年前 (2011/09/03 03:32), 編輯推噓7(7021)
留言28則, 4人參與, 最新討論串1/3 (看更多)
這是在 vc 2008 trace 時, 不小心發現的問題, trace 時, 由 F11 trace 一些 source code , 雖看得很吃力, 但仍硬看下去, 看到後來有點懷疑, 應該是有東西要在進入 main 之前先執行過才對, 想請教, vc 是否有方法, 能在進入 main 前, 先執行過某個函式 ? 謝謝各位。 問題已解決, 下述供參考。(還真是有趣的問題啊!!) --- 一開始一直試都不成功,原因在於 Visual C++ .c 不支援 C99, 改 .cpp 之後就過了,一開始查 msdn ,查到這份網頁 http://msdn.microsoft.com/en-us/library/bb918180.aspx 看完第一個 global variable initialize 後,裡面說明提到 According to the C/C++ standard, func() must be called before main() is executed. But who calls it? ( M$ 真是自打嘴巴,明明說標準可以這麼做,偏偏 .c 連這點都不支援) 這部份可能查 C99 會有更多的說明, 但 M$ 這份我覺得寫得還不錯。 基於上述,第一份 code 試作 // only for cpp #include <stdio.h> #include <stdlib.h> int* Alloc10(){ return (int*)malloc(sizeof(int)*10);} int *p = Alloc10(); int main() { int i; for(i=0; i!=10; ++i) p[i]=i; for(i=0; i!=10; ++i) printf("%d ", p[i]); free(p); return 0; } ---- 以下東西,對 Visual C++ 不感興趣可跳過。 在剛上面那個連結裡面,原文提及了 But who calls it? 又有幾個關鍵字 : .CRT$XCU .CRT$XCA .CRT$XCZ , 最後連到這個網站 http://zh-cn.w3support.net/index.php?db=so&id=728939 原來是在搞 #pragma section, 有興趣連進去看 section 在幹嘛 http://msdn.microsoft.com/en-us/library/sf9b18xk(v=vs.80).aspx 由於嫌對岸網站寫得太... 文言文,想說自己把能改的都改看看 #include <stdio.h> #pragma section(".CRT$XIC1",long,read) // ========================================== void before_main(void); /* function declare */ typedef void ( *pfpuc)(void); /* function pointer */ #define _CRTALLOC(x) __declspec(allocate(x)) /* set function before main */ _CRTALLOC(".CRT$XIC1") static pfpuc pinit1 = before_main; // ========================================== int z; void before_main(void) { z = 100; } int main(void) { printf("Some code before main!\n"); printf("z = %d\n", z); printf("End!\n"); return 0; } 嗯, 一切都正常執行,只是不確定有沒有拿掉不該拿的就是了。 --- 關於 debug 部份,可能也是我技巧沒很好 (最近 VS 2008 Debugger 常被我搞掛要重開) 但若照 MSDN 上對於 section header 說明, global variable initialize 之部份應該完全 trace 不到, 以上述的 *p = Alloc10(); 而言,按下 F11 就直接進到 main 了, 完全沒機會看到那段 ( Debug 從 main 開始 trace 也算合理吧 ) 。 而用 #pragma section, 那又更特別了,按下 F11 ,程式直接結束... 至於 e 大提到 dll 的話, 嗯, 目前我也不會追, 連導出函式名都不會。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41

09/03 03:37, , 1F
哪一種C++ project?
09/03 03:37, 1F

09/03 03:38, , 2F
普通 win32,console mode,再補一下,是沒 malloc,最後可
09/03 03:38, 2F

09/03 03:39, , 3F
正常 free 掉,所以認為應是在進入前就有 malloc..
09/03 03:39, 3F

09/03 03:47, , 4F
我只知道去看call stack, 誰call 了誰. XD
09/03 03:47, 4F

09/03 03:59, , 5F
.. 似乎找到一點線索了 http://codepad.org/UCAZIHc7
09/03 03:59, 5F

09/03 03:59, , 6F
trace 不到..
09/03 03:59, 6F

09/03 04:00, , 7F
global 變數的初始化XD
09/03 04:00, 7F

09/03 04:09, , 8F
trace 不到是指什麼? 感覺是有用DLL才追不進去?
09/03 04:09, 8F
※ 編輯: tropical72 來自: 180.177.78.41 (09/03 05:03)

09/03 05:02, , 9F
請忽略上一句關於DLL. 另外, 你有設中斷點(紅點)嗎?
09/03 05:02, 9F

09/03 05:04, , 10F
狂設中斷點,其實那設心安而已,用F11是進入函式逐步執行
09/03 05:04, 10F

09/03 05:05, , 11F
VS 用的 rand() 公式也是這樣被 F11 出來..
09/03 05:05, 11F

09/03 05:06, , 12F
第一份code, Alloc10() 跟 main()都會進去.
09/03 05:06, 12F

09/03 05:07, , 13F
第2份code, before_main()會進去, main()不會進去.
09/03 05:07, 13F

09/03 05:08, , 14F
至於為什麼, 我太弱不知道, 留給強者回答 XD
09/03 05:08, 14F

09/03 05:08, , 15F
!! 是我 setting 有問題嗎?我再研究一下,感謝 !!
09/03 05:08, 15F

09/03 05:09, , 16F
要去研究一下 crt0dat.c 裡面做了什麼事情.
09/03 05:09, 16F

09/03 05:10, , 17F
對了, 我是用 VS2010 版 (不知道有沒有差,先說明一下)
09/03 05:10, 17F

09/03 05:11, , 18F
我補一下好了,如果斷點是設成 Alloc10那裡,進得去,
09/03 05:11, 18F

09/03 05:12, , 19F
但一般 debug trace 時,怎會知道斷點要設在那 func ?
09/03 05:12, 19F

09/03 05:13, , 20F
(當然現在是知道直接先查 global variable 是真的)
09/03 05:13, 20F

09/03 05:20, , 21F
你會這樣trace, 應該是有一些東西是依附在win32 console
09/03 05:20, 21F

09/03 05:21, , 22F
平台上面. 我對那邊沒經驗也沒看過有人把自己寫的東西架
09/03 05:21, 22F

09/03 05:22, , 23F
構在win32 console上, 假如是這樣的方式, 應該會需要了
09/03 05:22, 23F

09/03 05:22, , 24F
解 crtexe.c 與 crt0dat.c 做了什麼事.
09/03 05:22, 24F

09/03 05:23, , 25F
用 call stack 也可以找到一些線索.
09/03 05:23, 25F

09/03 05:26, , 26F
嗯嗯,謝謝e大,這陣子有空再摸摸那兩隻 .c, 感謝.
09/03 05:26, 26F

09/03 21:23, , 27F
w3support 盡貼一些 stackoverflow 的翻譯內容
09/03 21:23, 27F

09/03 22:02, , 28F
p大沒說真沒注意到 stackoverflow 也有此文。
09/03 22:02, 28F
文章代碼(AID): #1EOIzOTX (C_and_CPP)
文章代碼(AID): #1EOIzOTX (C_and_CPP)