• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

                 摘要: 原文:http://ideapad.zol.com.cn/56/160_557421.html本樓層 是虛擬機設置貼子一樓是 Mac安裝帖子二樓是 工具下載位置,希望童鞋不要和我搶沙發神舟A560P i7-D2(Windows 7 X64環境下,VMware 8.0正式版)虛擬機首嘗MAC OS X 10.7 Lion系統成功,特將此好消息分享。2年了,終于我也裝上了Mac,我也成功的嘗...  閱讀全文

            posted @ 2012-04-07 07:30 RTY 閱讀(1458) | 評論 (0)編輯 收藏

            今天偶然寫了下面的程序(原來我寫的程序不一樣,下面的只是為了把問題簡化)

             

            1. void foo()  
            2. {  
            3.     int p = 0;  
            4.     if ( p == 0 )  
            5.         int i = 0;  
            6.     int a;  
            7. }  
            8.   
            9. int main()  
            10. {  
            11.     foo();  
            12. }  
              本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/fancylea/archive/2009/06/10/4256793.aspx 

             

             

            不幸的是偶然將這個文件保存成了test.c,然后編譯的時候出現了

             

            error, error C2143: syntax error : missing ';' before 'type'

             

            感覺很奇怪,細細看來所有的語法都似乎都是對的,更奇怪的是把文件改成cpp或者cc能正常編譯,把int a;和if調換下也能正常編譯。這樣的錯誤可能發生在當變量的聲明放在可執行代碼之后。而這個是在K&R C中規定的,但在ANSI C中廢除。

            MSDN (http://support.microsoft.com/kb/58559)給出的解釋如下:

             


             

            In Microsoft C, compiler errors C2143 and C2144 are defined as follows:

                C2143: syntax error : missing 'token1' before 'token2'
                C2144: syntax error : missing 'token' before type 'type'

             

            You may receive this error message if your program places executable code before a data declaration, an acceptable practice in Kernighan-and-Ritchie C. This practice has been outlawed in later versions of the ANSI drafts. 

            This error message will normally occur if a required closing curly brace (}), right parenthesis [)], or semicolon (;) is missing.


             

            注: The C Programming Language的作者簡稱K&R,也是C語言之父, 經常用K&R C來和ANSI C做對比。這本書的第二版已經用ANSI.

            我用的編譯器是VS2008, 看來微軟向來無視標準。

             

            總結:

            在 ANSI C或者C++中,在可執行代碼中隨時定義變量是允許的,但是在K&R C中是不允許的,VS2008實現的C竟然是K&R C。注意這樣的錯誤也體現在VS中要是用for (int i = 0; i++; i<10)同時你的文件名是.c的也會出現這樣的錯誤。

             

            Code complete中討論過變量名的最遲綁定有利于增加代碼的可讀性等。所以在VS中寫c要注意了。

            posted @ 2012-04-05 19:53 RTY 閱讀(1867) | 評論 (0)編輯 收藏

            請說出const與#define 相比,有何優點?
            答案:
            1) const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤。
                  2) 有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試。

            在8086 匯編下,邏輯地址和物理地址是怎樣轉換的?(Intel)
            答案:通用寄存器給出的地址,是段內偏移地址,相應段寄存器地址*10H+通用寄存器內地址,就得到了真正要訪問的地址。

            當一個類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk)
            答案:肯定不是零。舉個反例,如果是零的話,聲明一個class A[10]對象數組,而每一個對象占用的空間是零,這時就沒辦法區分A[0],A[1]…了。

             描述內存分配方式以及它們的區別?
            1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量
            2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集。
            3) 從堆上分配亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。

             main 函數執行以前,還會執行什么代碼?
            答案:全局對象的構造函數會在main 函數之前執行。

             C++是不是類型安全的?
            答案:不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast)。C#是類型安全的。

             

            有哪幾種情況只能用intialization list 而不能用assignment?

             

            答案:當類中含有const、reference 成員變量;基類的構造函數都需要初始化表。

            define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
            答案:i 為30

            New delete 與malloc free 的聯系與區別?
            答案:都是在堆(heap)上進行動態的內存操作。用malloc函數需要指定內存分配的字節數并且不能初始化對象,new 會自動調用對象的構造函數。delete 會調用對象的destructor,而free 不會調用對象的destructor.

             

            1、寫一個“標準”宏,這個宏輸入兩個參數并返回較小的一個。
            .#define Min(X, Y) ((X)>(Y)?(Y):(X))//結尾沒有;
            2、嵌入式系統中經常要用到無限循環,你怎么用C編寫死循環。
            while(1){}或者for(;;)
            3、關鍵字static的作用是什么?
            定義靜態變量
            4、關鍵字const有什么含意?
            表示常量不可以修改的變量。
            5、關鍵字volatile有什么含意?并舉出三個不同的例子?
            提示編譯器對象的值可能在編譯器未監測到的情況下改變。

             


            int (*s[10])(int) 表示的是什么啊
            int (*s[10])(int) 函數指針數組,每個指針指向一個int func(int param)的函數。

             


            1.有以下表達式:
            int a=248; b=4;int const c=21;const int *d=&a;
            int *const e=&b;int const *f const =&a;
            請問下列表達式哪些會被編譯器禁止?為什么?
            *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
            *c 這是個什么東東,禁止
            *d 說了是const, 禁止
            e = &a 說了是const 禁止
            const *f const =&a; 禁止
            2.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
            有兩種解法, 一種用算術算法, 一種用^(異或)
            a = a + b;
            b = a - b;
            a = a - b; 
            or
            a = a^b;// 只能對int,char..
            b = a^b;
            a = a^b;
            or
            a ^= b ^= a;
            3.c和c++中的struct有什么不同?
            c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而class默認為private
            4.#i nclude <stdio.h>
            #i nclude <stdlib.h>
            void getmemory(char *p)
            {
                p=(char *) malloc(100);
                strcpy(p,"hello world");
            }
            int main( )
            {
                char *str=NULL;
                getmemory(str);
                printf("%s/n",str);
                free(str);
                return 0;
               }
            程序崩潰,getmemory中的malloc 不能返回動態內存, free()對str操作很危險
            5.char szstr[10];
            strcpy(szstr,"0123456789");
            產生什么結果?為什么?
            長度不一樣,會造成非法的OS
            6.列舉幾種進程的同步機制,并比較其優缺點。
               原子操作 
            信號量機制
               自旋鎖
               管程,會合,分布式系統

             

            7.進程之間通信的途徑
            共享存儲系統
            消息傳遞系統
            管道:以文件系統為基礎
            11.進程死鎖的原因
            資源競爭及進程推進順序非法
            12.死鎖的4個必要條件
            互斥、請求保持、不可剝奪、環路
            13.死鎖的處理
            鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
            15.   操作系統中進程調度策略有哪幾種?
            FCFS(先來先服務),優先級,時間片輪轉,多級反饋
            8.類的靜態成員和非靜態成員有何區別?
            類的靜態成員每個類只有一個,非靜態成員每個對象一個
            9.純虛函數如何定義?使用時應注意什么?
            virtual void f()=0;
            是接口,子類必須要實現
            10.數組和鏈表的區別
            數組:數據順序存儲,固定大小
            連表:數據可以隨機存儲,大小可動態改變

             

            12.ISO的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優缺點?
            應用層
            表示層
            會話層
            運輸層
            網絡層
            物理鏈路層
            物理層
            tcp /udp屬于運輸層
            TCP 服務提供了數據流傳輸、可靠性、有效流控制、全雙工操作和多路復用技術等。
            與 TCP 不同, UDP 并不提供對 IP 協議的可靠機制、流控制以及錯誤恢復功能等。由于 UDP 比較簡單, UDP 頭包含很少的字節,比 TCP 負載消耗少。
            tcp: 提供穩定的傳輸服務,有流量控制,缺點是包頭大,冗余性不好
            udp: 不提供穩定的服務,包頭小,開銷小  

             


            1:(void *)ptr 和 (*(void**))ptr的結果是否相同?其中ptr為同一個指針
            .(void *)ptr 和 (*(void**))ptr值是相同的
            2:int main()
               {
                int x=3;
                printf("%d",x);
                return 1;
               
               }
            問函數既然不會被其它函數調用,為什么要返回1?
            mian中,c標準認為0表示成功,非0表示錯誤。具體的值是某中具體出錯信息

             


            1,要對絕對地址0x100000賦值,我們可以用
            (unsigned int*)0x100000 = 1234;
            那么要是想讓程序跳轉到絕對地址是0x100000去執行,應該怎么做?
            *((void (*)( ))0x100000 ) ( );
            首先要將0x100000強制轉換成函數指針,即:
            (void (*)())0x100000
            然后再調用它:
            *((void (*)())0x100000)();
            用typedef可以看得更直觀些:
            typedef void(*)() voidFuncPtr;
            *((voidFuncPtr)0x100000)();
            2,已知一個數組table,用一個宏定義,求出數據的元素個數
            #define NTBL
            #define NTBL (sizeof(table)/sizeof(table[0]))

             

            面試題: 線程與進程的區別和聯系? 線程是否具有相同的堆棧? dll是否有獨立的堆棧?
            進程是死的,只是一些資源的集合,真正的程序執行都是線程來完成的,程序啟動的時候操作系統就幫你創建了一個主線程。

             

            每個線程有自己的堆棧。
            DLL中有沒有獨立的堆棧,這個問題不好回答,或者說這個問題本身是否有問題。因為DLL中的代碼是被某些線程所執行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調用,那么這個時候是不是說這個DLL沒有自己獨立的堆棧?如果DLL中的代碼是由DLL自己創建的線程所執行,那么是不是說DLL有獨立的堆棧?

             

            以上講的是堆棧,如果對于堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的內存,最好是從DLL中刪除,如果你從DLL中分配內存,然后在EXE中,或者另外一個DLL中刪除,很有可能導致程序崩潰

             


            unsigned short A = 10;
            printf("~A = %u\n", ~A);

             

            char c=128; 
            printf("c=%d\n",c);

             

            輸出多少?并分析過程
            第一題,~A =0xfffffff5,int值 為-11,但輸出的是uint。所以輸出4294967285
            第二題,c=0x10,輸出的是int,最高位為1,是負數,所以它的值就是0x00的補碼就是128,所以輸出-128。
            這兩道題都是在考察二進制向int或uint轉換時的最高位處理。

             

            分析下面的程序:
            void GetMemory(char **p,int num)
            {
                *p=(char *)malloc(num);
                
            }        
            int main()
            {
                char *str=NULL;
                
                GetMemory(&str,100);
                
                strcpy(str,"hello");
                
                free(str);
                
                if(str!=NULL)
                {
                    strcpy(str,"world");
                }    
                    
                printf("\n str is %s",str);
                getchar();
            }    
            問輸出結果是什么?希望大家能說說原因,先謝謝了
            輸出str is world。
            free 只是釋放的str指向的內存空間,它本身的值還是存在的.
            所以free之后,有一個好的習慣就是將str=NULL.
            此時str指向空間的內存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲空間是可能被重新分配給其他變量的,
            盡管這段程序確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會打印出world來。
            這是因為,進程中的內存管理一般不是由操作系統完成的,而是由庫函數自己完成的。
            當你malloc一塊內存的時候,管理庫向操作系統申請一塊空間(可能會比你申請的大一些),然后在這塊空間中記錄一些管理信息(一般是在你申請的內存前面一點),并將可用內存的地址返回。但是釋放內存的時候,管理庫通常都不會將內存還給操作系統,因此你是可以繼續訪問這塊地址的,只不過。。。。。。。。樓上都說過了,最好別這么干。

             

            char a[10],strlen(a)為什么等于15?運行的結果

             

            #i nclude "stdio.h"
            #i nclude "string.h"

             

            void main()
            {

             

            char aa[10];
            printf("%d",strlen(aa));
            }

             

            sizeof()和初不初始化,沒有關系;
            strlen()和初始化有關。

             


            char (*str)[20];/*str是一個數組指針,即指向數組的指針.*/
            char *str[20];/*str是一個指針數組,其元素為指針型數據.*/

             

            long a=0x801010;
            a+5=?
            0x801010用二進制表示為:“1000 0000 0001 0000 0001 0000”,十進制的值為8392720,再加上5就是8392725羅

             

            1)給定結構struct A 
            {
                   char t:4;
                   char k:4;
                   unsigned short i:8;
                   unsigned long m;
            };問sizeof(A) = ?
            給定結構struct A 
            {
                   char t:4; 4位
                   char k:4; 4位
                   unsigned short i:8; 8位      
                   unsigned long m; // 偏移2字節保證4字節對齊
            }; // 共8字節
            2)下面的函數實現在一個數上加一個數,有什么錯誤?請改正。
            int add_n ( int n )
            {
                static int i = 100;
                i += n;
                return i;
            }
            當你第二次調用時得不到正確的結果,難道你寫個函數就是為了調用一次?問題就出在 static上?

             


            // 幫忙分析一下
            #i nclude<iostream.h>
            #i nclude <string.h>
            #i nclude <malloc.h>
            #i nclude <stdio.h>
            #i nclude <stdlib.h>
            #i nclude <memory.h>
            typedef struct AA
            {
                    int b1:5;
                    int b2:2;
            }AA;
            void main()
            {
                    AA aa;
                    char cc[100];
                     strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
                   memcpy(&aa,cc,sizeof(AA));
                    cout << aa.b1 <<endl;
                    cout << aa.b2 <<endl;
            }
            答案是 -16和1
            首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.
            經過strcpy和memcpy后,aa的4個字節所存放的值是:
            0,1,2,3的ASC碼,即00110000,00110001,00110010,00110011
            所以,最后一步:顯示的是這4個字節的前5位,和之后的2位
            分別為:10000,和01
            因為int是有正負之分  所以:答案是-16和1

             

            求函數返回值,輸入x=9999; 
            int func ( x )

                int countx = 0; 
                while ( x ) 
                { 
                    countx ++; 
                    x = x&(x-1); 
                } 
                return countx; 

            結果呢?
            知道了這是統計9999的二進制數值中有多少個1的函數,且有
            9999=9×1024+512+256+15

             

            9×1024中含有1的個數為2;
            512中含有1的個數為1;
            256中含有1的個數為1;
            15中含有1的個數為4;
            故共有1的個數為8,結果為8。
            1000 - 1 = 0111,正好是原數取反。這就是原理。
            用這種方法來求1的個數是很效率很高的。
            不必去一個一個地移位。循環次數最少。

             

            int a,b,c 請寫函數實現C=a+b ,不可以改變數據類型,如將c改為long int,關鍵是如何處理溢出問題
            bool add (int a, int b,int *c)
            {
            *c=a+b;
            return (a>0 && b>0 &&(*c<a || *c<b) || (a<0 && b<0 &&(*c>a || *c>b)));
            }

             


            分析:
            struct bit 
            {   int a:3; 
                int b:2; 
                int c:3; 
            }; 
            int main() 

            bit s; 
            char *c=(char*)&s; 
               cout<<sizeof(bit)<<endl;
            *c=0x99;
               cout << s.a <<endl <<s.b<<endl<<s.c<<endl; 
                 int a=-1;
               printf("%x",a);
            return 0; 

            輸出為什么是
            4
            1
            -1
            -4
            ffffffff
            因為0x99在內存中表示為 100 11 001 , a = 001, b = 11, c = 100
            當c為有符合數時, c = 100, 最高1為表示c為負數,負數在計算機用補碼表示,所以c = -4;同理 
            b = -1;
            當c為有符合數時, c = 100,即 c = 4,同理 b = 3

             


            位域 :   
            有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:     
            struct 位域結構名     
            { 位域列表 };    
            其中位域列表的形式為: 類型說明符 位域名:位域長度     
            例如:     
            struct bs    
            {    
            int a:8;    
            int b:2;    
            int c:6;    
            };    
            位域變量的說明與結構變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:     
            struct bs    
            {    
            int a:8;    
            int b:2;    
            int c:6;    
            }data;    
            說明data為bs變量,共占兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點說明:   

             

            1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:     
            struct bs    
            {    
            unsigned a:4    
            unsigned :0 /*空域*/    
            unsigned b:4 /*從下一單元開始存放*/    
            unsigned c:4    
            }    
            在這個位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開始,占用4位,c占用4位。   

             

            2. 由于位域不允許跨兩個字節,因此位域的長度不能大于一個字節的長度,也就是說不能超過8位二進位。   

             

            3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:     
            struct k    
            {    
            int a:1    
            int :2 /*該2位不能使用*/    
            int b:3    
            int c:2    
            };    
            從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。   

             

            二、位域的使用位域的使用和結構成員的使用相同,其一般形式為: 位域變量名•位域名 位域允許用各種格式輸出。    
            main(){    
            struct bs    
            {    
            unsigned a:1;    
            unsigned b:3;    
            unsigned c:4;    
            } bit,*pbit;    
            bit.a=1;    
            bit.b=7;    
            bit.c=15;    
            pri

             

            改錯:
            #i nclude <stdio.h>

             

            int main(void) {

             

                int **p;
                int arr[100];

             

                p = &arr;

             

                return 0;
            }
            解答:
            搞錯了,是指針類型不同,
            int **p; //二級指針
            &arr; //得到的是指向第一維為100的數組的指針
            #i nclude <stdio.h>
            int main(void) {
            int **p, *q;
            int arr[100];
            q = arr;
            p = &q;
            return 0;
            }

             


            下面這個程序執行后會有什么錯誤或者效果:
            #define MAX 255
            int main()
            {
               unsigned char A[MAX],i;//i被定義為unsigned char
               for (i=0;i<=MAX;i++)
                  A[i]=i;
            }
            解答:死循環加數組越界訪問(C/C++不進行數組越界檢查)
            MAX=255 
            數組A的下標范圍為:0..MAX-1,這是其一..
            其二.當i循環到255時,循環內執行:
            A[255]=255;
            這句本身沒有問題..但是返回for (i=0;i<=MAX;i++)語句時,
            由于unsigned char的取值范圍在(0..255),i++以后i又為0了..無限循環下去.

             

            struct name1{
               char str;
               short x;
               int   num;
            }

             

            struct name2{
               char str;
               int num;
               short x;
            }

             

            sizeof(struct name1)=8,sizeof(struct name2)=12
            在第二個結構中,為保證num按四個字節對齊,char后必須留出3字節的空間;同時為保證整個結構的自然對齊(這里是4字節對齊),在x后還要補齊2個字節,這樣就是12字節。

             

            intel:
            A.c 和B.c兩個c文件中使用了兩個相同名字的static變量,編譯的時候會不會有問題?這兩個static變量會保存到哪里(棧還是堆或者其他的)?
            static的全局變量,表明這個變量僅在本模塊中有意義,不會影響其他模塊。
            他們都放在數據區,但是編譯器對他們的命名是不同的。
            如果要使變量在其他模塊也有意義的話,需要使用extern關鍵字。

             

            struct s1
            {
            int i: 8;
            int j: 4;
            int a: 3;
            double b;
            };

             

            struct s2
            {
            int i: 8;
            int j: 4;
            double b;
            int a:3;
            };

             

            printf("sizeof(s1)= %d\n", sizeof(s1));
            printf("sizeof(s2)= %d\n", sizeof(s2));
            result: 16, 24
            第一個struct s1
            {
            int i: 8;
            int j: 4;
            int a: 3;
            double b;
            };
            理論上是這樣的,首先是i在相對0的位置,占8位一個字節,然后,j就在相對一個字節的位置,由于一個位置的字節數是4位的倍數,因此不用對齊,就放在那里了,然后是a,要在3位的倍數關系的位置上,因此要移一位,在15位的位置上放下,目前總共是18位,折算過來是2字節2位的樣子,由于double是8字節的,因此要在相對0要是8個字節的位置上放下,因此從18位開始到8個字節之間的位置被忽略,直接放在8字節的位置了,因此,總共是16字節。

             

            第二個最后會對照是不是結構體內最大數據的倍數,不是的話,會補成是最大數據的倍數

             

            上面是基本問題,接下來是編程問題:

             


            本人很弱,這幾個題也搞不定,特來求救:
            1)讀文件file1.txt的內容(例如):
            12
            34
            56
            輸出到file2.txt:
            56
            34
            12
            (逆序)
            2)輸出和為一個給定整數的所有組合
            例如n=5
            5=1+4;5=2+3(相加的數不能重復)
            則輸出
            1,4;2,3。
            望高手賜教!!

             

            第一題,注意可增長數組的應用.
            #i nclude <stdio.h>
            #i nclude <stdlib.h>

             

            int main(void)
            {
                     int MAX = 10;
            int *a = (int *)malloc(MAX * sizeof(int));
            int *b;
                
            FILE *fp1;
            FILE *fp2;

             

            fp1 = fopen("a.txt","r");
            if(fp1 == NULL)
            {printf("error1");
                exit(-1);
            }

             

                fp2 = fopen("b.txt","w");
            if(fp2 == NULL)
            {printf("error2");
                exit(-1);
            }

             

            int i = 0;
                int j = 0;

             

            while(fscanf(fp1,"%d",&a[i]) != EOF)
            {
            i++;
            j++;
            if(i >= MAX)
            {
            MAX = 2 * MAX;
            b = (int*)realloc(a,MAX * sizeof(int));
            if(b == NULL)
            {
            printf("error3");
            exit(-1);
            }
            a = b;
            }
            }

             

            for(;--j >= 0;)
               fprintf(fp2,"%d\n",a[j]);

             

            fclose(fp1);
            fclose(fp2);

             

            return 0;
            }

             

            第二題.
            #i nclude <stdio.h>

             

            int main(void)
            {
            unsigned long int i,j,k;

             

            printf("please input the number\n");
            scanf("%d",&i);
                if( i % 2 == 0)
                    j = i / 2;
            else
            j = i / 2 + 1;

             

            printf("The result is \n");
                for(k = 0; k < j; k++)
                 printf("%d = %d + %d\n",i,k,i - k);
            return 0;
            }

             

            #i nclude <stdio.h>
            void main()
            {
            unsigned long int a,i=1;
            scanf("%d",&a);
            if(a%2==0)
            {
                 for(i=1;i<a/2;i++)
                 printf("%d",a,a-i);
            }
            else
            for(i=1;i<=a/2;i++)
                    printf(" %d, %d",i,a-i);
            }

             

            兄弟,這樣的題目若是做不出來實在是有些不應該, 給你一個遞規反向輸出字符串的例子,可謂是反序的經典例程.

             

            void inverse(char *p)
            {
                if( *p = = '\0' ) 
            return;
                inverse( p+1 );
                printf( "%c", *p );
            }

             

            int main(int argc, char *argv[])
            {
                inverse("abc\0");

             

                return 0;
            }

             

            借簽了樓上的“遞規反向輸出”
            #i nclude <stdio.h>
            void test(FILE *fread, FILE *fwrite)
            {
                    char buf[1024] = {0};
                    if (!fgets(buf, sizeof(buf), fread))
            }



            posted @ 2012-04-05 14:54 RTY 閱讀(823) | 評論 (0)編輯 收藏

            http://www.shnenglu.com/lf426/archive/2008/03/19/44831.html 

            作者:龍飛

            1:擴充庫(Extension Libraries)

                    SDL本身所支持的,僅僅是讀取bmp格式的圖片。要使用其它格式的圖片,我們需要使用SDL的擴充庫。在下面地址,我們可以下載到相關文件SDL_image-devel-1.2.6-VC8.zip
            http://www.libsdl.org/projects/SDL_image/
                    與SDL本身的設置一樣,將include下的*.h文件拷貝到:
            C:\MinGW\include\SDL (MinGW)
            C:\Program Files\Microsoft Visual Studio 9.0\VC\include\SDL (VC2008)
                    將*.lib文件拷貝到:
            C:\MinGW\lib (MinGW)
            C:\Program Files\Microsoft Visual Studio 9.0\VC\lib (VC2008)
                    將*.dll文件拷貝到:
            C:\WINDOWS\system32

                    在編譯的時候,gcc注意增加共同編譯的庫文件-lSDL_image,比如,我設置了一個批處理文件g++img.bat內容如下:
            g++ -o MySDL.exe main.cpp -lmingw32 -lSDLmain -lSDL -lSDL_image -mwindows
                    在VC2008中,需要在projec屬性中,Configuration Properties -- Linker -- Input -- Additional Dependencies 下增加SDL_image.lib。

                    在程序的頭文件中,需要增加:
            #include "SDL/SDL_image.h"

            2:更加通用的Display Surface構造函數

                    我們現在可以回頭過來修改我們在SDL入門教程(五):6、對C++異常機制的思考,代碼重寫中的Display Surface類的構造函數,使其能夠更加通用的讀取其它格式的圖片。
            DisplaySurface::DisplaySurface(std::string file_name, const ScreenSurface& screen):
            fileName(file_name)
            {
                SDL_Surface
            * pSurfaceTemp = IMG_Load(file_name.c_str());
                
            if ( pSurfaceTemp == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                pSurface 
            = SDL_DisplayFormat(pSurfaceTemp);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                SDL_FreeSurface(pSurfaceTemp);
                pScreen 
            = screen.point();
            }
                    IMG_Load()可以讀取多種格式的圖片文件,包括BMP, PNM, XPM, LBM, PCX, GIF, JPEG, TGA和PNG。

            3:將圖片修改為適合顯示的格式
            SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface);
                    在上面的程序中,我們使用到了函數SDL_DisplayFormat()。在之前的教程中,我一直沒有用到這個函數,是因為我還沒有發現用SDL_LoadBMP()的時候會出現格式兼容性的問題——即使是圖片位深與顯示不一致。但是使用IMG_Load()的時候,小小的bug出現了。所以,這里我必須使用SDL_DisplayFormat(),將讀取的圖片文件轉換為適合顯示的格式。
                    如果轉換失敗,或者內存溢出,這個函數將返回空指針。 

            posted @ 2012-04-04 08:25 RTY 閱讀(620) | 評論 (0)編輯 收藏

            Configure,Makefile.am, Makefile.in, Makefile文件之間關系
            2009-08-12 12:14

            1.autoscan (autoconf): 掃描源代碼以搜尋普通的可移植性問題,比如檢查編譯器,庫,頭文件等,生成文件configure.scan,它是configure.ac的一個雛形。

            your source files --> [autoscan*] --> [configure.scan] --> configure.ac

            2.aclocal (automake):根據已經安裝的宏,用戶定義宏和acinclude.m4文件中的宏將configure.ac文件所需要的宏集中定義到文件 aclocal.m4中。aclocal是一個perl 腳本程序,它的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”
            user input files   optional input     process          output files
            ================ ============== ======= ============

            acinclude.m4 - - - - -.
            V
            .-------,
            configure.ac ------------------------>|aclocal|
            {user macro files} ->| |------> aclocal.m4
            `-------'
            3.autoheader(autoconf): 根據configure.ac中的某些宏,比如cpp宏定義,運行m4,聲稱config.h.in

            user input files optional input process output files
            ================ ============== ======= ============

            aclocal.m4 - - - - - - - .
            |
            V
            .----------,
            configure.ac ----------------------->|autoheader|----> autoconfig.h.in
            `----------'

            4.automake: automake將Makefile.am中定義的結構建立Makefile.in,然后configure腳本將生成的Makefile.in文件轉換 為Makefile。如果在configure.ac中定義了一些特殊的宏,比如AC_PROG_LIBTOOL,它會調用libtoolize,否則它 會自己產生config.guess和config.sub

            user input files   optional input   processes          output files
            ================ ============== ========= ============

            .--------,
            | | - - -> COPYING
            | | - - -> INSTALL
            | |------> install-sh
            | |------> missing
            |automake|------> mkinstalldirs
            configure.ac ----------------------->| |
            Makefile.am ----------------------->| |------> Makefile.in
            | |------> stamp-h.in
            .---+ | - - -> config.guess
            | | | - - -> config.sub
            | `------+-'
            | | - - - -> config.guess
            |libtoolize| - - - -> config.sub
            | |--------> ltmain.sh
            | |--------> ltconfig
            `----------'

            5.autoconf:將configure.ac中的宏展開,生成configure腳本。這個過程可能要用到aclocal.m4中定義的宏。

            user input files   optional input   processes          output files
            ================ ============== ========= ============

            aclocal.m4 ,autoconfig.h.in - - - - - - -.
            V
            .--------,
            configure.ac ----------------------->|autoconf|------> configure
             
            6. ./configure的過程

            .-------------> [config.cache]
            configure* --------------------------+-------------> config.log
            |
            [config.h.in] -. v .--> [autoconfig.h]
            +-------> config.status* -+
            Makefile.in ---' `--> Makefile
             
            7. make過程
             
            [autoconfig.h] -.
            +--> make* ---> 程序
            Makefile ---'
             
            .---------,
            config.site - - ->| |
            config.cache - - ->|configure| - - -> config.cache
            | +-,
            `-+-------' |
            | |----> config.status
            config.h.in ------->|config- |----> config.h
            Makefile.in ------->| .status|----> Makefile
            | |----> stamp-h
            | +--,
            .-+ | |
            | `------+--' |
            ltmain.sh ------->|ltconfig|-------> libtool
            | | |
            `-+------' |
            |config.guess|
            | config.sub |
            `------------'

            .--------,
            Makefile ------>| |
            config.h ------>| make |
            {project sources} ---------------->| |--------> {project targets}
            .-+ +--,
            | `--------' |
            | libtool |
            | missing |
            | install-sh |
            |mkinstalldirs|
            `-------------'
            實例:
            在/hello/目錄下創建一個hello.c文件,并編譯運行它:

            #cd /hello/

            (1) 編寫源文件hello.c:

            #include<stdio.h>
            int main(int argc, char** argv)
            {
            printf("Hello, GNU!n");
            return 0;
            }

            [litao@vm0000131 hello]$ ll
            total 4
            -rw-rw-r-- 1 litao litao 68 Aug 12 12:02 hello.c

            一、autoscan

            [litao@vm0000131 hello]$ autoscan
            autom4te: configure.ac: no such file or directory
            autoscan: /usr/bin/autom4te failed with exit status: 1
            [litao@vm0000131 hello]$ ll
            total 8
            -rw-rw-r-- 1 litao litao 0 Aug 12 12:03 autoscan.log
            -rw-rw-r-- 1 litao litao 457 Aug 12 12:03 configure.scan
            -rw-rw-r-- 1 litao litao 68 Aug 12 12:02 hello.c

            已經生成了configure.scan,autoscan.log文件

            將configure.scan 修改為 configure.in,最后修改的內容如下:

            [litao@vm0000131 hello]$ mv configure.scan configure.in
            [litao@vm0000131 hello]$ vim configure.in

            # -*- Autoconf -*-
            # Process this file with autoconf to produce a configure script.

            AC_PREREQ(2.59)
            AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
            AC_CONFIG_SRCDIR([hello.c])
            #AC_CONFIG_HEADER([config.h])
            AM_INIT_AUTOMAKE(hello, 1.0)
            # Checks for programs.
            AC_PROG_CC

            # Checks for libraries.

            # Checks for header files.

            # Checks for typedefs, structures, and compiler characteristics.

            # Checks for library functions.
            AC_OUTPUT(Makefile)

            二、acloacl

            [litao@vm0000131 hello]$ aclocal

            生成 aclocal.m4 和 autom4te.cache (生成aclocal.m4的過程中涉及到configure.in)

            [litao@vm0000131 hello]$ ll
            total 44
            -rw-rw-r-- 1 litao litao 31120 Aug 12 12:08 aclocal.m4
            drwxr-xr-x 2 litao litao 4096 Aug 12 12:08 autom4te.cache
            -rw-rw-r-- 1 litao litao 0 Aug 12 12:03 autoscan.log
            -rw-rw-r-- 1 litao litao 496 Aug 12 12:08 configure.in
            -rw-rw-r-- 1 litao litao 68 Aug 12 12:02 hello.c

            三、antoconf

            [litao@vm0000131 hello]$ autoconf
            生成 configure (根據 configure.in, 和 aclocal.m4)
            [litao@vm0000131 hello]$ ll
            total 168
            -rw-rw-r-- 1 litao litao 31120 Aug 12 12:08 aclocal.m4
            drwxr-xr-x 2 litao litao 4096 Aug 12 12:11 autom4te.cache
            -rw-rw-r-- 1 litao litao 0 Aug 12 12:03 autoscan.log
            -rwxrwxr-x 1 litao litao 122297 Aug 12 12:11 configure
            -rw-rw-r-- 1 litao litao 496 Aug 12 12:08 configure.in
            -rw-rw-r-- 1 litao litao 68 Aug 12 12:02 hello.c

            四、編寫Makefile.am:

            AUTOMAKE_OPTIONS= foreign
            bin_PROGRAMS= hello
            hello_SOURCES= hello.c

            五、automake

            生成 Makefile.in, depcomp, install-sh, 和 missing (根據 Makefile.am, 和 aclocal.m4)

            [litao@vm0000131 hello]$ automake
            configure.in: required file `./install-sh' not found
            configure.in: required file `./missing' not found
            Makefile.am: required file `./depcomp' not found
            [litao@vm0000131 hello]$ automake --add-missing
            configure.in: installing `./install-sh'
            configure.in: installing `./missing'
            Makefile.am: installing `./depcomp'
            [litao@vm0000131 hello]$ ll
            total 192
            -rw-rw-r-- 1 litao litao 31120 Aug 12 12:08 aclocal.m4
            drwxr-xr-x 2 litao litao 4096 Aug 12 12:14 autom4te.cache
            -rw-rw-r-- 1 litao litao 0 Aug 12 12:03 autoscan.log
            -rwxrwxr-x 1 litao litao 122297 Aug 12 12:11 configure
            -rw-rw-r-- 1 litao litao 496 Aug 12 12:08 configure.in
            lrwxrwxrwx 1 litao litao 31 Aug 12 12:16 depcomp -> /usr/share/automake-1.9/depcomp
            -rw-rw-r-- 1 litao litao 68 Aug 12 12:02 hello.c
            lrwxrwxrwx 1 litao litao 34 Aug 12 12:16 install-sh -> /usr/share/automake-1.9/install-sh
            -rw-rw-r-- 1 litao litao 69 Aug 12 12:15 Makefile.am
            -rw-rw-r-- 1 litao litao 16561 Aug 12 12:16 Makefile.in
            lrwxrwxrwx 1 litao litao 31 Aug 12 12:16 missing -> /usr/share/automake-1.9/missing

            六、configure
            生成 Makefile, config.log, 和 config.status


            posted @ 2012-04-03 22:20 RTY 閱讀(815) | 評論 (0)編輯 收藏

            導讀:

            /C:在預處理輸出中保留注釋語句
            /c:只編譯,不連接,相當于在"Build"菜單下選擇了"Compile"
            /D:定義常量和宏,與源程序里的#define 有相同效果
            /E:預處理C、C++源文件,將源文件中所有的預編譯指令及宏展開,將注釋去掉,然后將預處理器的輸出拷貝至標準輸出設備輸出,并且在每個文件的開頭和末尾加入#line
            /EH:指定編譯器用何種異常處理模型
            /EP:同/E,只是去掉了#line
            /F:設置程序的堆棧大小
            /FA:設置生成何種列表文件(匯編、匯編與機器碼、匯編與源碼、匯編與機器碼以及源碼)
            /Fa:指定用/FA設置的列表文件的存放路徑及(或)文件名
            /FD:生成文件的相互依賴信息
            /Fd:設置程序數據庫文件(PDB)的存放路徑及(或)文件名
            /Fe:設置最終可執行文件的存放路徑及(或)文件名
            /FI:預處理指定的頭文件,與源文件中的#include有相同效果
            /Fm:創建map文件
            /Fo:設置編譯后Obj文件的存放路徑及(或)文件名
            /Fp:設置預編譯文件(pch)的存放路徑及(或)文件名
            /FR:生成瀏覽信息(sbr)文件
            /Fr:同/FR,不同之處在于/Fr不包括局部變量信息
            /G3:為80386處理器優化代碼生成
            /G4:為80486處理器優化代碼生成
            /G5:為Pentium處理器優化代碼生成
            /G6:為Pentium Pro處理器優化代碼生成
            /GA:為Windows應用程序作優化
            /GB:為Pentium處理器優化代碼生成,使用80386、80486、Pentium、Pentium Pro的混合指令集,是代碼生成的默認選項(程序屬性選項中Processor對應Blend)
            /GD:為Windows動態庫(dll)作優化,此開關在VC6中沒有實現
            /Gd:指定使用__cdecl的函數調用規則
            /Ge:激活堆棧檢測
            /GF:消除程序中的重復的字符串,并將她放到只讀的緩沖區中
            /Gf:消除程序中的重復字符串
            /Gh:在每個函數的開頭調用鉤子(hook)函數--penter
            /Gi:允許漸進編譯
            /Gm:允許最小化rebuild
            /GR:允許運行時類型信息(Run-Time Type Infomation)
            /Gr:指定使用__fastcall的函數調用規則
            /Gs:控制堆棧檢測所用內存大小
            /GT:支持用__declspec(thread)分配的數據的fier-safety
            /GX:允許同步異常處理,與/EHsc開關等價
            /Gy:允許編譯器將每一個函數封裝成COMDATs的形式,供連接器調用
            /GZ:允許在Debug build 的時候捕捉Release build的錯誤
            /Gz:指定使用__stdcall的函數調用規則
            /H:限制外部名字的長度
            /HELP:列出編譯器的所有的命令開關
            /I:指定頭文件的搜索路徑
            /J:將char的缺省類型從signed char改成unsigned char
            /LD:創建一個動態連接庫
            /LDd:創建一個Debug版本的動態鏈接庫
            /link:將指定的選項傳給連接器
            /MD:選擇多線程、DLL版本的C Run-Time庫
            /MDd:選擇多線程、DLL、Debug版本的C Run-Time庫
            /ML:選擇單線程版本的C Run—Time庫
            /MLd:選擇單線程、Debug版本的C Run—Time庫
            /MT:選擇多線程版本的C Run-Time庫
            /MTd:選擇多線程、Debug版本的C Run—Time庫
            /nologo:不顯示程序的版權信息
            /O1:優化使產生的可執行代碼最小
            /O2:優化使產生的可執行代碼速度最快
            /Oa:指示編譯器程序里沒有使用別名,可以提高程序的執行速度
            /Ob:控制內聯(inline)函數的展開
            /Od:禁止代碼優化
            /Og:使用全局優化
            /Oi:用內部函數去代替程序里的函數調用,可以使程序運行的更快,但程序的長度變長
            /Op:提高浮點數比較運算的一致性
            /Os:產生盡可能小的可執行代碼
            /Ot:產生盡可能塊的可執行代碼
            /Ow:指示編譯器在函數體內部沒有使用別名
            /Ox:組合了幾個優化開關,達到盡可能多的優化
            /Oy:阻止調用堆棧里創建幀指針
            /Q1f:對核心級的設備驅動程序生成單獨的調試信息
            /QI0f:對Pentium 0x0f錯誤指令作修正
            /Qifdiv:對Pentium FDIV錯誤指令作修正
            /P:將預處理輸出寫到指定文件里,文件的后綴名為I
            /TC:將命令行上的所有文件都當作C源程序編譯,不管后綴名是否為.c
            /Tc:將指定的文件當作C源程序編譯,不管后綴名是否為.c
            /TP:將命令行上的所有文件都當作C++源程序編譯,不管后綴名是否為.cpp
            /Tp:將指定文件當作C++源程序編譯,不管后綴名是否為.cpp
            /U:去掉一個指定的前面定義的符號或常量
            /u:去掉所有前面定義的符號或常量
            /V:在編譯的obj文件里嵌入版本號
            /vd:禁止/允許構造函數置換
            /vmb:選擇指針的表示方法,使用這個開關,在聲明指向某個類的成員的指針之前,必須先定義這個類
            /vmg:選擇指針的表示方法,使用這個開關,在聲明指向某個類的成員的指針之前,不必先定義這個類,但要首先指定這個類是使用何種繼承方法
            /vmm:設置指針的表示方法為Single Inheritance and Multiple Inheritance
            /vms:設置指針的表示方法為Single Inheritance
            /vmv:設置指針的表示方法為Any class
            /W:設置警告等級
            /w:禁止所有警告
            /X:阻止編譯器搜索標準的include 目錄
            /Yc:創建預編譯頭文件(pch)
            /Yd:在所有的obj文件里寫上完全的調試信息
            /Yu:在build過程中使用指定的預編譯頭文件
            /YX:指示編譯器若預編譯頭文件存在,則使用它,若不存在,則創建一個
            /Z7:生成MSC7.0兼容的調試信息
            /Za:禁止語言擴展(Microsoft Extensions to C)
            /Zd:調試信息只包含外部和全局的符號信息以及行號信息
            /Ze:允許語言擴展(Microsoft Extensions to C)
            /Zg:為源文件里面定義的每個函數生成函數原型
            /ZI:生成程序庫文件(Pdb)并支持Edit and Continue調試特性
            /Zi:生成程序庫文件(pdb),包含類型信息和符號調試信息
            /ZL:從obj文件里去掉缺省的庫文件名
            /Zm:設置編譯器的內存分配xianzhi
            /Zn:禁止瀏覽信息文件里面的封裝
            /Zp:設置結構成員在內存里面的封裝格式
            /Zs:快速檢查語法錯誤
            --------------------------
            vc所支持的文件類型


            DSW:全稱是Developer Studio Workspace,最高級別的配置文件,記錄了整個工作空間的配置信息,她是一個純文本的文件,在vc創建新項目的時候自動生成
            DSP:全稱是Developer Studio Project,也是一個配置文件,不過她記錄的是一個項目的所有配置信息,純文本文件
            OPT:與DSW、DSP配合使用的配置文件,她記錄了與機器硬件有關的信息,同一個項目在不同的機器上的opt文件內容是不同的
            CLW:記錄了跟ClassWizard相關的信息,如果丟失了clw文件,那么在Class View面板里就沒有類信息
            PLG:實際上是一個超文本文件,可以用Internet Explorer打開,記錄了Build的過程,是一個日志型文件
            RC:資源描述文件,記錄了所有的資源信息,在資源編輯器里作的修改,實際上都是對RC文件的修改
            RC2:附加的資源描述文件,不能直接資源編輯器修改,只能手工添加,可以用來添加額外的資源
            RES:經過資源編輯器編譯之后的資源文件,以二進制方式存放
            SBR:編譯器生成的瀏覽信息文件,在代碼導航的時候非常有用,她需要在編譯時指定/FR或者/Fr開關
            BSC:BSCMAKE.EXE將所有的SBR文件作為輸入,經過處理之后輸出一個BSC文件,在代碼導航的時候實際用到的是BSC文件
            ILK:當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息
            PDB:全稱是Program DataBase,即程序數據庫文件,用來記錄調試信息,是一個相當重要的文件,沒有他,程序無法正常調試
            LIB:如果項目輸出是Dll的話,一般會輸出一個跟項目同名的Lib文件,記錄輸出的函數信息
            EXP:同Lib,是跟Dll一起生成的輸出文件
            PCH:全稱是PreCompiled Header,就是預先編譯好的頭文件,在編譯時指定/Yu開關時編譯器自動生成



            本文轉自
            http://www.shnenglu.com/sunraiing9/archive/2007/11/26/37323.html

            posted @ 2012-03-30 20:46 RTY 閱讀(550) | 評論 (0)編輯 收藏

            導讀:


            版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
            http://chenshine.blogbus.com/logs/4414354.html


            剛 進入計算機相關專業領域時,大家最先用過的調試器大多會是Turbo C。它雖然古老但用過的人卻很多,然而嚴格的講,Turbo C是一個集成開發環境,雖然擁有獨立的編譯器,鏈接器,卻沒有獨立的調試器,這和Visual Studio一樣。如果你做過DOS,早期Windows下的匯編,也許你會對Debug,CodeView等調試工具熟悉,但這些工具太老 了,Debug甚至不能調試32位程序,介紹它們與這篇文章的主旨不符,如果你對它們感興趣,可以去查閱相關資料。本文主要是介紹與調試技術相關的理論知 識以及常用調試器的使用,Windows設備驅動程序與內核的調試等。具體的講解方法是理論結合實踐,并且是站在給新手看的角度,循序漸進的,用一個一個 調試會話向你展示每個重要命令的使用。



            目錄

            1。調試器
            2。調試信息
            3。用戶模式程序的調試
            4。驅動程序與內核的調試

            1 調試器

            1。1 概覽

            調 試器,與編譯器,鏈接器一樣,都屬于基礎軟件,它們在制作上都有很大的難度,但盡管如此,現實中還是有不少專業級的調試器,微軟官方的就有 cdb,ntsd,WinDbg,kd等,還有SoftIce,OllyDbg等來自于其它公司的優秀調試器。本文不可能對這幾個調試器一一介紹,一個是 限于篇幅,另一個是上面列舉的這幾個調試器無論是哪一個都需要你花很長的時間去完全掌握(在市面上有很多書籍甚至專門講解某一個調試器的使用,比如 SoftIce)。雖然本文不會講解SoftIce的詳細使用,但我還是要對它進行簡短的介紹,因為它太有名了,甚至比Windows出生的早。

            1。2 SoftIce

            SoftIce 是NuMega公司生產的調試器,產于80年代后期,直到今天為止,這個軟件已經變革過好幾次了,因為處理器的體系結構在更新,操作系統也在更新,所以調 試器也必須相應的更新。它之所以有名,那是與歷史有關的,在Intel推出386 Cpu的時候,NuMega立即讓SoftIce支持了386 Cpu的新特性,同時吸引了大量黑客的使用,使它在黑客界產生了一定的地位(功能強大的調試器可以對軟件的保護機制進行破解,如突破序列號之類的)。在 Windows推出時,所有的調試器都不適用這種新的系統軟件體系結構了,唯一能用的就是微軟自己生產的調試器,卻很拙劣,這時NuMega又對 SoftIce進行了變革,不僅讓它可以在新的系統上很好的工作,甚至還可以調試Windows的內核,這是當時是不敢想象的。也正是因為它很好的性能, 卓越的功能,它成為了黑客們的寵兒,并且培養了幾代的黑客。讀完本文后,你自己應該有能力去探索它,或許你也可以在這幾款調試器里找到適合自己的。

            1。3 微軟的調試工具

            本 文主要介紹的是微軟官方的調試器,并且MS微軟也最積極,調試工具包一直在更新中。在微軟的調試器里,大家可能最為熟悉Visual Studio Debugger,就是你在Visual C++里使用的那個,它并不是一個單獨可運行的程序,而是內嵌在Visual Studio中的,它的功能相對于上面幾個調試器來說要弱很多,這里并不會對它進行介紹,如果你想全方面的了解它的話,你可以去參考MSDN,那里專門有 幾章講解它,是一份很好的文檔化的資源(而且還是中文的)。其它的微軟調試工具cdb,ntsd,WinDbg,kd都在微軟的一個安裝包里,被稱作Debugging Tools for Windows(10 多M的大小,請通過這個鏈接下載并安裝,一會兒就要用到)。這些調試器在下文中會分別介紹,這里先做一個簡單的區別,cdb與ntsd幾乎是一樣的程序, 唯一的不同是cdb是一個CUI程序,即Console程序,而ntsd是GUI程序,但ntsd并沒有產生窗口,而是又分配了一個Console窗口, 這個Console窗口就相當于是cdb。它與真正的cdb執行完全一樣的功能(官方如是說,然而實際上還有一些個不同)。在命令行中啟動它們時下面兩句 命令有一樣的效果(C:/Progs/Debug是調試工具包的安裝位置):

            C:/Progs/Debug/>start cdb
            C:/Progs/Debug/>ntsd

            cdb 與ntsd是用來調試用戶模式應用程序的。kd調試器也是一個命令行程序,不過正如其名kernel debugger所描述的一樣,它是內核調試器的,是驅動程序開發者,系統Hacker的最愛。WinDbg是一個稱職的GUI程序,它有菜單,有工具 欄,還有多個子窗口,可以分別顯示源代碼,調用棧,命令等,它既可以調試ring 0程序,也可以調試ring 3程序,其實它只是一個殼而已,當調試ring 3級程序時它實際上是用cdb/ntsd,而當調試ring 0級程序時是用kd。WinDbg的到來吸引了很多的人使用,你也將會發現,它確實是一款優秀的調試器。

            2 調試信息

            調試器之所以能夠工作,完全是依賴于編譯和鏈接程序時所生成的調試信息,當然調試信息是具有一定的格式的。

            2。1 格式

            微 軟的調試信息格式經過了幾代變化,最終形成了Program DataBase這種格式,并且這種格式還在進行版本上的更新,VS.Net所用的新的Program DataBase版本與Visual C++ 6.0所用的老的版本是不兼容的,并且你也可以用編譯器和鏈接器明確指定你想要生成的調試信息格式,這一點下文中有闡述。

            2。2 內容

            關 于調試信息我們還必須知道兩件事,一是調試信息包括哪些內容,二是調試信息儲存在什么地方。其實調試信息所應該包括的內容正是調試信息格式變化的原因,從 COFF格式,到CodeView格式,到Program DataBase格式,調試信息變得越來越豐富了,并且是只多不少。Program DataBase格式的調試信息中主要包括了所有全局函數,static 函數,全局變量,static變量,局部變量,函數形參的名字及其位置,源代碼與可執行文件中指令的映射信息,每個函數與變量的類型,以及FPO信息,編 輯和繼續信息。編輯與繼續信息主要用于在Visual Studio中調試時,可以在調試的同時編輯源代碼,并在接下來的調試中得到體現。Program DataBase格式的調試信息包含了這么多的內容,所以用這種調試信息來調試程序時,你將能夠得到更多,更準確,更深入的反饋。

            2。3 存儲位置

            調 試信息的存儲位置是與其格式相關的,Program DataBase格式的調試信息存儲在一個單獨的文件里,擴展名為pdb。像以前的CodeView格式的調試信息即可存儲在單獨的文件里,又可存儲在編 譯時所生成的obj文件中。知道了這些知識后,我們就可以正確地生成調試信息了。在后面的內核調試中我們還要繼續談到它。

            3 用戶模式程序的調試

            根 據上面的講述,我們可以用cdb或WinDbg來進行ring 3程序的調試,這里先講解cdb。cdb允許你啟動某個被調試程序(以下稱debugee)的一個新的實例來進行調試,即先創建cdb,然后cdb再把你 所指定的程序創建為一個新進程進而對其調試,也允許debugee在已經運行的情況下被cdb attach上。cdb還可以對Crash Dump(程序崩潰時的內存Copy,下文將會說明)進行調試,只需要加上-z選項,后面再加上Crash Dump的文件名即可。這幾種調試方式下面將會一一講述。

            3。1 調試前的準備

            第 2節中對調試信息進行了理論上的說明,接下來我們來看看在實際中應該如何操作。首先我們的程序必須要經過編譯,鏈接,并且在編譯和鏈接時還要指定一些選項 以正確地生成調試信息。這里所使用的編譯器是cl.exe,鏈接器是link.exe,都是微軟官方的,Visual Studio就是用的這兩個(CTRL+F5就是順序調用cl和link的快捷鍵),如果你安裝了Visual C++或Visual Studio,就會有它們,另外一種選擇是安裝SDK,也能夠得到它們。本文所用的cl.exe和link.exe是Visual C++ 6.0的版本。若要生成調試信息,編譯時我們需要加上的選項應是/Zi,而鏈接時則要加上/debug。在下面的調試中,我們將用C語言來寫程序,所以你 有必要知道用C語言寫出來的程序與用匯編寫出來的有什么不同。首先,每個程序都有一個入口函數,它的地址需要在鏈接時指定,并被鏈接器放到最終可執行文件 的頭部,通常用匯編語言寫的程序,有選擇的,你可以在源代碼中指定入口函數,而用C語言寫的程序則需要在鏈接的時候來指定入口函數,說到這你可能不以為 然,“C語言寫的程序的入口函數不就是main嗎?“。實際上,控制臺C程序的入口函數默認情況下是C運行時的啟動函數:mainCRTStartup。 然后由這個函數調用你寫的main函數,所以可執行文件的頭部存放的入口地址是mainCRTStartup的地址,而不是你寫的main函數地址。 mainCRTStartup主要做了一些為了正確執行C/C++程序的初始化工作。它已經由微軟寫好了,由鏈接器自動鏈接到可執行文件中。如果你在程序 中不使用C語言的庫以及一些ANSI規定的全局變量,只是單純地使用C語言這種語法,那么你也可以不鏈接mainCRTStartup,直接指定你自己寫 的某個函數為入口函數,這也是我們在下文中所使用的方法,具體的做法是在鏈接時加入如下選項:/subsystem:console /entry:你的入口函數名稱。這個入口函數應該是不帶參數的。現在我們來總結一下上面所講的內容,假定你的源程序名為exam.c,你想指定的入口函 數為main,那么應該如下生成可執行程序:

            C:/Pro/>cl /Zi exam.c /link /debug /subsystem:console /entry:main
            另 外,就算你不鏈接mainCRTStartup(它會調用很多的Win32 API),也不在源程序中調用任何的系統函數。那么系統還是會把一些動態鏈接庫,如kernel32.dll,Ntdll.dll等動態鏈接到你的程序所 對應的進程里,即把它們映射到你的程序對應的進程地址空間里。這是因為在你所指定的入口函數運行之前,還會有一系列的 Kernel32.dll,Ntdll.dll中的函數要運行。即在用戶空間中你指定的入口函數,例如上面的main,根本不是第一個運行的函數。那么那 些函數是做什么的呢,通過大量的反匯編和調試能夠推斷出它們是做一些進程,線程在用戶空間的初始化,設置一些異常楨等。在下面的調試中我們將會用一些手段 來研究它們。這些函數是操作系統的一部分,因些我們必須從官方網站下載它的符號文件,當然不下載也行,那么你將面臨的會是一大堆的警告。說到下載,沒有比 這更簡單的了,你不需要預先的下載,只需要添加一個環境變量_NT_SYMBOL_PATH即可,而真正的下載工作由調試器來做,這個環境變量的值與已存 在的PATH環境變量類似,是由分號分隔的一系列的路徑組成。這些路徑應該包括你的調試信息文件(pdb文件)所在地,如前面的C:/Pro/。如果要下 載系統文件如Kernel32.dll,Ntdll.dll的pdb文件,你僅僅需要再加一個這樣的路徑:SRV*D:/Symbols*http: //msdl.microsoft.com/download/symbols,其中D:/Symbols是可更換的,你可以換成任何一個其它的路徑,這 個D:/Symbls是用來存放從后面的URL路徑所下載下來的系統調試信息文件的。其實你也可以預先下載系統調試信息文件到一個路徑里,然后在 _NT_SYMBOL_PATH里指定那個目錄,但這樣一來有兩個缺點,一是你必須得進行版本的匹配,做這件事簡直太乏味了,二是你一次需要把整個操作系 統的調試信息文件都下載下來,可能會需要1G的空間。而通過前面設置環境變量的方式,調試器會根據需要只下載這次調試會話所需要的調試信息文件,并且它會 自動給你匹配版本。由于我們將要編寫的源代碼都在C:/Pro/文件夾中,生成的pdb文件也在C:/Pro/中,所以我們的 _NT_SYMBOL_PATH環境變量應該如下設置,假設你希望系統pdb文件下載到D:/Symbols:
            C:/Pro/>set _NT_SYMBOL_PATH=SRV*D:/Symbols*http://msdl.microsoft.com/download/symbols;C:/Pro/
            最后,我們需要在命令行中啟動cdb調試器,但當前目錄通常是源代碼文件夾C:/Pro/,為了避免如下冗余的鍵入:

            C:/Pro/>C:/Progs/Debug/cdb example1.exe
            應該為cdb,ntsd,WinDbg設置PATH環境變量:

            C:/Pro/>set PATH=%PATH%;C:/Progs/Debug/
            這里的C:/Progs/Debug是Debugging Tools for Windows的安裝目錄。以后就可以這樣來調試了:

            C:/Pro/>cdb example1.exe

            3。2 cdb啟動新實例的調試

            3。2。1 編寫一源程序,啟動cdb

            首先我編寫了下面的C程序,先用這個程序來介紹一些基本的命令,并且來驗證一下調試信息中是否確切包含了上面所說的那些內容:

            [example1.c]
            int 		gVar;
            static int sgVar;
            int Inc(int Param);
            static int sDec(int sParam);
            void main(void)
            {
            int lVar;
            static int slVar;
            lVar = 3;
            slVar = 4;
            gVar = Inc(lVar);
            sgVar = sDec(slVar);
            }
            int Inc(int Param)
            {
            return (Param+1);
            }
            int sDec(int sParam)
            {
            return (sParam-1);
            }
            對這個程序用上面所講的方法編譯鏈接:
            C:/Pro/>cl /Zi example1.c /link /debug /subsystem:console /entry:main
            接下來啟動cdb調試器:

            C:/Pro/>cdb example1.exe

            Microsoft (R) Windows Debugger
            Copyright (c) Microsoft Corporation. All rights reserved.

            CommandLine: example1.exe
            Symbol search path is: SRV*D:/Symbols*http://msdl.microsoft.com/download/symbols
            Executable search path is:
            ModLoad: 00400000 00406000 example1.exe
            ModLoad: 7c920000 7c9b4000 ntdll.dll
            ModLoad: 7c800000 7c91c000 C:/WINDOWS/system32/kernel32.dll
            (c94.c24): Break instruction exception - code 80000003 (first chance)
            eax=00251eb4 ebx=7ffd4000 ecx=00000001 edx=00000002 esi=00251f48 edi=00251eb4
            eip=7c921230 esp=0012fb20 ebp=0012fc94 iopl=0 nv up ei pl nz na po nc
            cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
            ntdll!DbgBreakPoint:
            7c921230 cc int 3
            0:000>
            cdb 輸出了此時主線程的上下文信息(這個例子中也只有這一個線程)以及程序斷點信息后便會進入一個新的提示符:0:000>。以后我們會一直工作在這種 類型的提示符上,下面在這個提示符上輸入一個命令來加載所有的調試信息文件,此時可能會慢一些,因為要下載系統DLL的pdb文件,所以要確保你能上網。

            0:000>.reload /f

            看到這個以"."號做為前綴的命令,可能你會覺得怪怪的,但實際上還有用"!"號做前綴的呢,用"."號做前綴的命令表示元命令,而用"!“號做前綴的命令表示擴展命令,這里只做一個簡單的區分即可。

            其 實這時我們所要調試的程序已經運行起來了,不過停在了某處,主線程處于凍結狀態。這一點和Linux的Gnu調試器GDB不一樣,對于GDB調試器,你先 要設置一個斷點,然后再鍵入運行命令(如果自己不手動設置一個斷點,那么程序將會一直運行直到結束,你根本沒有調試的機會。),這時程序才處于運行狀態。 沒有運行和運行之后處于凍結狀態是兩個完全不同的概念。那么我們這個example1.exe停在了什么地方呢。下面我將介紹一個很重要的命令,用它我們 可以來研究這方面的問題。

            3。2。2 查看堆棧及用戶空間的初始化

            用kb命令可以來查看堆棧,它顯示棧上一些重要的信息。

            0:000>kb
            ChildEBP RetAddr Args to Child
            0012fb1c 7c95edc0 7ffdf000 7ffd4000 00000000 ntdll!DbgBreakPoint
            0012fc94 7c941639 0012fd30 7c920000 0012fce0 ntdll!LdrpInitializeProcess+0xffa
            0012fd1c 7c92eac7 0012fd30 7c920000 00000000 ntdll!_LdrpInitialize+0x183
            00000000 00000000 00000000 00000000 00000000 ntdll!KiUserApcDispatcher+0x7
            這個命令所列出來的信息后面還要詳細介紹,這里先關注一下函數的調用關系。從上面的列表可以看到有四個函數,這四個函數都是ntdll模塊里的,從下至上函數依次被調用。要注意這是當前線程的用戶棧里所有的東西,就四個函數,KiUserApcDispatcher是第一個,上面已經提到過,在你指定的入口函數執行之前還有很多的函數被調用,KiUserApcDispatcher是第一個被調用的,接下來它再調用_LdrpInitialize_LdrpInitialize調用LdrpInitializeProcess,再調用DbgBreakPoint。至于是誰調用的KiUserApcDispatcher,我現在只能簡單的告訴你是操作系統調度例程調度的結果。深入地探討它就離開本文的主題了。現在我們可以肯定的是程序停在了DbgBreakPoint里,因為它是棧上最后一個函數。從cdb調試器的輸出可以看到example1.exe停在了DbgBreakPoint函數里的int 3語句上,int 3是一個異常,它將會通知操作系統掛起這個線程,并且通知調試器,這是操作系統對調試的一個支持。其實DbgBreakPoint函數只有一條語句,那就是int 3。敏感點的人可能會想到,這樣一來,所有的程序,無論是否被調試,在運行的時候最初都會執行DbgBreakPoint函數了,這也太傻了吧?情況并非如此,當我們鍵入cdb example1.exe時,cdb在啟動example1.exe的時候會加一個特殊的標記,在這種情況下LdrpInitializeProcess才會調用DbgBreakPoint,這又是操作系統對調試的一個支持。


            本文轉自
            http://chenshine.blogbus.com/logs/4414354.html

            posted @ 2012-03-30 20:45 RTY 閱讀(831) | 評論 (0)編輯 收藏

                 前面學習中,很多地方都用到了C++和JavaScript相互通信。今天就學習QtScript模塊吧。

                Qt 包含完全集成的 ECMA 標準腳本引擎。Qt Script 集成了 QObject,為腳本提供了 Qt 的信號與槽 (Signals & Slots) 機制,可在 C++ 和腳本之間進行集成。 腳本支持可使開發事半功倍,QtScript提供腳本錯誤報告,用戶可用自己的腳本跟蹤程序缺陷.

               下面是一個簡單的hello程序。

               

             

            1. //main.cpp  
            2. #include <QtGui/QApplication>  
            3. #include <QMessageBox>  
            4. #include <QtScript/QtScript>  
            5. #include <QPushButton>  
            6. #include "mainwindow.h"  
            7.   
            8. int main(int argc, char *argv[])  
            9. {  
            10.     Q_INIT_RESOURCE(helloscript);  
            11.     QApplication app(argc, argv);  
            12.     QScriptEngine engine;  
            13.   
            14.     //國際化  
            15.     QTranslator translator;  
            16.     translator.load("helloscript_la");  
            17.     app.installTranslator(&translator);  
            18.     engine.installTranslatorFunctions();  
            19.   
            20.     QPushButton button;  
            21.     QScriptValue scriptButton = engine.newQObject(&button);//生成C++對象的代理腳本對象  
            22.     engine.globalObject().setProperty("button", scriptButton);//將對象注冊到javascript  
            23.   
            24.     //讀取js文件  
            25.     QString fileName(":/helloscript.js");  
            26.     QFile scriptFile(fileName);  
            27.     scriptFile.open(QIODevice::ReadOnly);  
            28.     QTextStream stream(&scriptFile);  
            29.     QString contents = stream.readAll();  
            30.     scriptFile.close();  
            31.   
            32.     QScriptValue result = engine.evaluate(contents, fileName);//執行腳本  
            33.     if(result.isError()) {//解析js文件是否有錯誤  
            34.         QMessageBox::critical(0, "Hello Script",  
            35.                               QString::fromLatin1("%0:%1: %2")  
            36.                               .arg(fileName)//文件名  
            37.                               .arg(result.property("lineNumber").toInt32())//錯誤行號  
            38.                               .arg(result.toString()));//錯誤信息  
            39.         return -1;  
            40.     }  
            41.     return app.exec();  
            42. }  
              

             

             

             

             

            [javascript] view plaincopy
            1. //helloscript.js  
            2. button.text = qsTr('Hello World');//note that the qTr() function is used to allow for translation  
            3. button.styleSheet = 'font-style: italic; color: #12FF12';  
            4. button.show();//調用show()槽函數  
            5. button.clicked.connect(  
            6.     function(){  
            7.        print('Hello QtScript');  
            8.     }  
            9. );  

             

             

            記住還需要在.pro文件中加入:QT       += script

             

                1、QScriptEngine類為程序提供一個嵌入式腳本環境。一個應用程序中可以添加多個腳本引擎;每一個引擎都是一個輕量級自包含的虛擬機。通過調用腳本引擎的evaluate()函數可以執行腳本.

               

            [c-sharp] view plaincopy
            1. QScriptEngine engine;  
            2. QScriptValue result = engine.evaluate("(3*2)-1");  
            3. qDebug() << "Result: " << result.toInt32();  

             

                

             

              

            1. QScriptEngine engine;  
            2. QScriptValue func = engine.evaluate("(function(a, b) { return a+b;})");  
            3. QScriptValueList args;  
            4. args << 1 << 2;  
            5. QScriptValue result = func.call(QScriptValue(), args);  
            6. qDebug() << "Result: " << result.toInt32();  

             

             

             

                2、QScriptValue是一個Qt Script數據類型的容器,支持ECMA-262定義的類型,如:

                 原始數據類型:Undefined,Null,Boolean,Number,String,對象類型。

                 另外Qt Script還內建支持QVariant,QObject和QMetaObject.

                  >>對于基對象(object-based)類型(包括Date和RegExp),使用QScriptEngine對象的newT()函數(如QScriptEngine::newObject())創建一個你期望的QScriptValue類型。

                  >>對于原始數據類型,直接使用QScriptValue構造函數加載。

                  isT()方法能夠被用來測試一個值是否是你確定的數據類型。toT()方法用來將QScriptValue轉換成其他類型。當然你也可以用qscriptvalue_cast()方法.

            posted @ 2012-03-29 13:43 RTY 閱讀(2027) | 評論 (0)編輯 收藏

            Most of us would not have expected the next major version of Mac OS X so quickly this time. But, Apple has released the developer preview-1 of OS X 10.8 Mountain Lion recently.  While people were talking about iPad 3 and iPhone 5, Mac desktop users surprised by latest OS from Apple (though it is not a final version for end users). Mac OS X 10.8 is still a developer preview version to run and test the new OS. You can directly download the official distribution of 10.8 if you have valid Apple developer ID.  Here I’m sharing few useful links to download OS X 10.8 Mountain Lion without developer login.

            These files should be enough to run on normal Intel or virtual machines by using hackintosh methods.

            Mountain Lion OS brings most of the features of iOS (iPad and iPhone) to desktop OS environment on top of existing Lion OS X 10.7. The major features of new OS include;

            • Messages – replaces iChat to bring full iMessage support to the Mac
            • Notification Center – just like iOS
            • Share Sheets – allows easy sharing of links, videos, photos between apps
            • AirPlay mirroring – send wireless video to an Apple TV
            • Notes
            • Reminders
            • Game Center
            • Twitter Integration
            • Gatekeeper – anti-Malware app installation guard

            You can find out more information here at official link to Mountain Lion.

            Hackintosh Versions of Mac OS X 10.8,

            Here is the link to download developer preview –1 of OS X 10.8 Mountain Lion (you must have developer id to download form apple site)

             

            How to Download Torrent and Hackintosh versions of Mac OS X 10.8 Mountain Lion

            As I mentioned earlier, the official download works only with developer login. If you are trying to download though torrent sites, here is the good news.

            1) Untouched version

            This torrent should be working fine as per the comments on this torrent forum. I have just finished downloading this torrent, and will update you soon on how to install it on VMware or VirtualBox. This version is not modified (as mentioned ‘untouched’) to work on Hackintosh platform, but I’m hoping this will work with VMware and VirtualBox on Intel based Windows computers. I could see a comment saying he managed to install it on VMware successfully.

            Download link of torrent

            2) Hackintosh Version

            On the same forum someone called this as Hackintosh version, but I’m not sure how it will be working.  I think this image doesn’t require installation. Just you can restore to USB stick or virtual machine hard disk, install Chameleon bootloader and boot the Hackintosh or virtual machine. If this works as said, I’m sure that will save huge time and work around. I will have a try after few days once I succeeded with above original image.

            Download link of torrent

            Stay tuned with Sysprobs for more Hackintosh on VMware and VirtualBox of Mac OS X 10.8 Mountain Lion news.

            Recommended Posts

            posted @ 2012-03-18 09:31 RTY 閱讀(633) | 評論 (0)編輯 收藏

            This article explains how to create a bootable (Mac) OS X 10.8 mountain Lion image (and ISO) for VMware workstation on Intel based Windows 7 computer. Recently I have mentioned about official 10.8 developer preview download and torrent download of latest OS from Apple. The original DMG file can not be booted on any hackintosh methods. But, by using this guide we can prepare a bootable image of Mountain Lion OS X and start the installation on VMware workstation as guest virtual machine.

            This guide is nothing to do with Hackintosh on physical computer. I have tested on desktop virtualization software VMware workstation only. So, it will be useful to run the developer preview version of OS X 10.8 without disturbing your physical Operating Systems.  Also, it is very safe, easy and possible to use with multiple Operating Systems simultaneously.

            OK, let’s come to our point. Here I’m explaining how to prepare the OS X 10.8 image and ISO which can be booted on VMware workstation with Intel based Windows computers. Usually the official dmg file should be used inside an existing Mac OS machine to install it in different partition (dual boot) or update the existing OS X. So, starting the installation on fresh virtual machine with same dmg file is not possible without doing few modifications.

            This method is exactly same which we used earlier to prepare Lion OS X 10.7 bootable image. Since I already explained each steps with Lion OS X earlier, I’m not going to repeat the same instructions here. Anyhow, keep reading…..

             

            What You Need?

            1) A working Snow Leopard or Lion OS X virtual machine on VMware or VirtualBox.

            More information available on how to install Snow Leopard on VMware, VirtualBox and Lion OS X on VMwareVirtualBox.

            2) Mountain Lion DMG file (Click here to read more)

             

            Summary – What We Are Going to Do?

            1) We will attach a new virtual hard disk (5GB) to existing Mac OS X virtual machine.

            2) Mount the Mountain Lion dmg file inside virtual machine.

            3) Restore the BaseSystem and packages (from downloaded dmg file) to newly attached virtual hard disk from virtual machine. Also few modifications.

            4) Now we can attach the ‘prepared’ 5GB virtual hard disk to new virtual machine to boot and start the installation.

            That’s it. Its very easy. But please follow the instruction correctly.

             

            Steps to Create Bootable OS X 10.8 Mountain Lion DMG on VMware Workstation

            1) Attach a 5GB new virtual hard disk to working Mac OS X  virtual machine. In this example, I’m doing it with Lion OS X (10.7) VM on VMware workstation, my host is Windows 7 32 bit.

            added disk

            2) Start the VM. Initialize the disk and format the newly added 5GB external hard disk with following configuration.

            Single partition with ‘Mac OS X Extended (Journaled)’ and ‘Apple Partition Map’ type which is available under Options in below screen.

            create new partition

            3) Now, we need to mount the 10.8 installation file. As you are aware OS X 10.8 installation file is in DMG format which will not work directly with VMware workstation. I tried to convert the DMG file to ISO on Windows 7 host as mentioned earlier in Sysprobs, but for some reasons it failed.

            So, I have directly copied mountain Lion dmg file (using USB disk) into working Lion 10.7 virtual machine. Then mounted by double clicking the dmg file.

            mounting dmg file

            4) Make sure its mounted properly. Check the listed volumes as shown below.

            mounted disk

            Above screen shows the mounted OS X 10.8 dmg file as ‘Mac OS X Install ESD’ and my new hard disk which I formatted in Step 2 as ‘bootablelion’.

            5) We are ready to start the restore and copy important packages process from mounted dmg file to new hard disk.

            As I said, the further steps clearly mentioned with screen shots earlier for Lion OS X (10.7).

            Please click here to visit the previous guide and follow the steps carefully.

            Also, you can create Mountain Lion bootable ISO file using the same method, which is clearly mentioned by these videos ( Click here)

             

            IMPORTANT NOTE:

            In previous guide, the new hard disk named as ‘LionInstaller’, but in this new example it is named as ‘bootablelion’. Also, when you restore the BaseSystem image, it may overwrite the partition name and you will get a new name as ‘Mac OS X Install ESD 1’. So, either rename the partition again before continue next steps or type the new name correctly on appropriate places while typing the commands.

            6) After new disk created properly, it can be attached to new virtual machine and start Mountain Lion installation. Please make sure, you have already applied VMware unlocker to be able to run Mac OS X guest virtual machines on Windows platform. Check our earlier guide on VMware 8.0 and 8.0.1 unlocker.

            Here is the first screen booted by ‘prepared’ 5GB hard disk on VMware workstation 8.0.1 on Windows 7 32 bit host.

            I will provide the step by step guide and additional required installation for Mountain Lion OS X 10.8 on VMware workstation in coming days.

            first screen

            I’m sure this guide will be helpful to prepare the bootable image of Mountain Lion for VMware workstation and VM Player. Mostly this should work with Oracle VirtualBox too, but we need to find out the correct boot loader for that. I will keep searching for that and update in this blog later.

            Have fun!

            Recommended Posts

            posted @ 2012-03-18 09:29 RTY 閱讀(2632) | 評論 (0)編輯 收藏

            僅列出標題
            共31頁: 1 2 3 4 5 6 7 8 9 Last 
            久久99精品国产麻豆蜜芽| 日本加勒比久久精品| 思思久久99热只有频精品66| 国产精品久久免费| 无码超乳爆乳中文字幕久久| 国产69精品久久久久观看软件| 久久AV高潮AV无码AV| 久久精品中文字幕有码| 精品免费久久久久国产一区| 中文字幕成人精品久久不卡| 青青青国产精品国产精品久久久久| 亚洲精品高清国产一线久久| 国内精品久久久久影院老司| 精品无码久久久久久久久久| 国产精品综合久久第一页| 一本伊大人香蕉久久网手机| 久久精品国产亚洲欧美| 国产精品永久久久久久久久久| 久久久WWW成人| 久久精品女人天堂AV麻| 国产精品丝袜久久久久久不卡 | 中文成人久久久久影院免费观看| 久久天天躁狠狠躁夜夜av浪潮 | 99精品久久久久久久婷婷| 青青草原综合久久大伊人导航 | 久久66热人妻偷产精品9| 人妻精品久久无码专区精东影业| 97热久久免费频精品99| 国产精品青草久久久久婷婷| 国产精品久久久久一区二区三区| 久久中文精品无码中文字幕| 亚洲婷婷国产精品电影人久久| 欧美大香线蕉线伊人久久| 久久久久无码精品国产| 久久夜色精品国产亚洲| 无码任你躁久久久久久久| 久久久黄色大片| 久久国产精品一区二区| 无码乱码观看精品久久| 久久精品人人做人人爽97| 久久精品人妻一区二区三区|