導航:首頁 > 程序命令 > iosgdb命令

iosgdb命令

發布時間:2022-07-11 18:19:17

① Microsoft Visual C++ 在蘋果系統用什麼代替

在蘋果(ios)的系統中,你可以使用Xcode來進行程序編譯


Xcode 是蘋果公司開發的編程軟體,是開發人員建立OS X 和 iOS 應用程序的最快捷的方式。Xcode 具有統一的用戶界面設計,編碼、測試、調試都在一個簡單的窗口內完成。

根據斯諾登提供的資料,美國政府研究人員創建了一個版本的蘋果軟體應用開發工具Xcode,希望藉此將監控後門植入到通過蘋果應用商店App Store發布的應用程序中。

The Xcode suite 包含有:
GNU Compiler Collection自由軟體 :(GCC、 apple-darwin9-gcc-4.0.1 以及 apple-darwin9-gcc-4.2.1, 默認的是第一個)。
它支持 C語言、C++、Fortran、Objective-C、Objective-C++、Java、AppleScript、Python以及Ruby。
它還提供Cocoa、Carbon以及Java等編程模式。
協力廠商更提供了 GNU Pascal,Free Pascal, Ada, C#, Perl, Haskell 和 D語言。Xcode套件使用 GDB作為其後台調試工具。

——Xcode網路

詳情參見:PGCrp7BkpzRwVZQK
(Xcode網路)

linux 用g++編譯c++代碼的問題

*

運行 gcc/egcs
*

gcc/egcs 的主要選項
*

gdb
*

gdb 的常用命令
*

gdb 使用範例
*

其他程序/庫工具 (ar, objmp, nm, size, strings, strip, ...)
* 創建和使用靜態庫
* 創建和使用共享庫
* 使用高級共享庫特性

1.7.1 運行 gcc/egcs

Linux 中最重要的軟體開發工具是 GCC。GCC 是 GNU 的 C 和 C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和 Object C(C 語言的一種面向對象擴展)。利用 gcc 命令可同時編譯並連接 C 和 C++ 源程序。

#DEMO#: hello.c

如果你有兩個或少數幾個 C 源文件,也可以方便地利用 GCC 編譯、連接並生成可執行文件。例如,假設你有兩個源文件 main.c 和 factorial.c 兩個源文件,現在要編譯生成一個計算階乘的程序。

-----------------------
清單 factorial.c
-----------------------
#include <stdio.h>
#include <stdlib.h>

int factorial (int n)
{
if (n <= 1)
return 1;

else
return factorial (n - 1) * n;
}
-----------------------

-----------------------
清單 main.c
-----------------------
#include <stdio.h>
#include <stdlib.h>

int factorial (int n);

int main (int argc, char **argv)
{
int n;

if (argc < 2) {
printf ("Usage: %s n\n", argv [0]);
return -1;
}
else {
n = atoi (argv[1]);
printf ("Factorial of %d is %d.\n", n, factorial (n));
}

return 0;
}
-----------------------

利用如下的命令可編譯生成可執行文件,並執行程序:
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.

GCC 可同時用來編譯 C 程序和 C++ 程序。一般來說,C 編譯器通過源文件的後綴名來判斷是 C 程序還是 C++ 程序。在 Linux 中,C 源文件的後綴名為 .c,而 C++ 源文件的後綴名為 .C 或 .cpp。

但是,gcc 命令只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接。因此,通常使用 g++ 命令來完成 C++ 程序的編譯和連接,該程序會自動調用 gcc 實現編譯。假設我們有一個如下的 C++ 源文件(hello.C):

#include <iostream.h>

void main (void)
{
cout << "Hello, world!" << endl;
}

則可以如下調用 g++ 命令編譯、連接並生成可執行文件:

$ g++ -o hello hello.C
$ ./hello
Hello, world!

1.7.2 gcc/egcs 的主要選項

表 1-3 gcc 命令的常用選項
選項 解釋
-ansi 只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色,
例如 asm 或 typeof 關鍵詞。
-c 只編譯並生成目標文件。
-DMACRO 以字元串「1」定義 MACRO 宏。
-DMACRO=DEFN 以字元串「DEFN」定義 MACRO 宏。
-E 只運行 C 預編譯器。
-g 生成調試信息。GNU 調試器可利用該信息。
-IDIRECTORY 指定額外的頭文件搜索路徑DIRECTORY。
-LDIRECTORY 指定額外的函數庫搜索路徑DIRECTORY。
-lLIBRARY 連接時搜索指定的函數庫LIBRARY。
-m486 針對 486 進行代碼優化。
-o FILE 生成指定的輸出文件。用在生成可執行文件時。
-O0 不進行優化處理。
-O 或 -O1 優化生成代碼。
-O2 進一步優化。
-O3 比 -O2 更進一步優化,包括 inline 函數。
-shared 生成共享目標文件。通常用在建立共享庫時。
-static 禁止使用共享連接。
-UMACRO 取消對 MACRO 宏的定義。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

#DEMO#

MiniGUI 的編譯選項
1.7.3 gdb

GNU 的調試器稱為 gdb,該程序是一個互動式工具,工作在字元模式。在 X Window 系統中,
有一個 gdb 的前端圖形工具,稱為 xxgdb。gdb 是功能強大的調試程序,可完成如下的調試
任務:
* 設置斷點;
* 監視程序變數的值;
* 程序的單步執行;
* 修改變數的值。
在可以使用 gdb 調試程序之前,必須使用 -g 選項編譯源文件。可在 makefile 中如下定義
CFLAGS 變數:
CFLAGS = -g
運行 gdb 調試程序時通常使用如下的命令:
gdb progname

在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:
* aliases:命令別名
* breakpoints:斷點定義;
* data:數據查看;
* files:指定並查看文件;
* internals:維護命令;
* running:程序執行;
* stack:調用棧查看;
* statu:狀態查看;
* tracepoints:跟蹤程序執行。
鍵入 help 後跟命令的分類名,可獲得該類命令的詳細清單。

#DENO#
1.7.4 gdb 的常用命令

表 1-4 常用的 gdb 命令
命令 解釋
break NUM 在指定的行上設置斷點。
bt 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。
clear 刪除設置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM。
continue 繼續執行正在調試的程序。該命令用在程序由於處理信號或斷點而
導致停止運行時。
display EXPR 每次程序停止後顯示表達式的值。表達式由程序定義的變數組成。
file FILE 裝載指定的可執行文件進行調試。
help NAME 顯示指定命令的幫助信息。
info break 顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被調試文件的詳細信息。
info func 顯示所有的函數名稱。
info local 顯示當函數中的局部變數信息。
info prog 顯示被調試程序的執行狀態。
info var 顯示所有的全局和靜態變數名稱。
kill 終止正被調試的程序。
list 顯示源代碼段。
make 在不退出 gdb 的情況下運行 make 工具。
next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。
print EXPR 顯示表達式 EXPR 的值。

1.7.5 gdb 使用範例

-----------------
清單 一個有錯誤的 C 源程序 bugging.c
-----------------
#include <stdio.h>
#include <stdlib.h>

static char buff [256];
static char* string;
int main ()
{

printf ("Please input a string: ");
gets (string);

printf ("\nYour string is: %s\n", string);
}
-----------------
上面這個程序非常簡單,其目的是接受用戶的輸入,然後將用戶的輸入列印出來。該程序使用了
一個未經過初始化的字元串地址 string,因此,編譯並運行之後,將出現 Segment Fault 錯誤:
$ gcc -o test -g test.c
$ ./test
Please input a string: asfd
Segmentation fault (core mped)
為了查找該程序中出現的問題,我們利用 gdb,並按如下的步驟進行:
1.運行 gdb bugging 命令,裝入 bugging 可執行文件;
2.執行裝入的 bugging 命令;
3.使用 where 命令查看程序出錯的地方;
4.利用 list 命令查看調用 gets 函數附近的代碼;
5.唯一能夠導致 gets 函數出錯的因素就是變數 string。用 print 命令查看 string 的值;
6.在 gdb 中,我們可以直接修改變數的值,只要將 string 取一個合法的指針值就可以了,為
此,我們在第 11 行處設置斷點;
7.程序重新運行到第 11 行處停止,這時,我們可以用 set variable 命令修改 string 的取值;
8.然後繼續運行,將看到正確的程序運行結果。

#DEMO#

1.7.6 其他程序/庫工具

strip:

nm:

size:

string:

1.7.7 創建和使用靜態庫

創建一個靜態庫是相當簡單的。通常使用 ar 程序把一些目標文件(.o)組合在一起,成為一個單獨的庫,然後運行 ranlib,以給庫加入一些索引信息。

1.7.8 創建和使用共享庫

特殊的編譯和連接選項

-D_REENTRANT 使得預處理器符號 _REENTRANT 被定義,這個符號激活一些宏特性。
-fPIC 選項產生位置獨立的代碼。由於庫是在運行的時候被調入,因此這個
選項是必需的,因為在編譯的時候,裝入內存的地址還不知道。如果
不使用這個選項,庫文件可能不會正確運行。
-shared 選項告訴編譯器產生共享庫代碼。
-Wl,-soname -Wl 告訴編譯器將後面的參數傳遞到連接器。而 -soname 指定了
共享庫的 soname。

# 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,並以
root 身份運行 ldconfig;或者
# 運行 export LD_LIBRARY_PATH='pwd',它把當前路徑加到庫搜索路徑中去。

1.7.9 使用高級共享庫特性

1. ldd 工具

ldd 用來顯示執行文件需要哪些共享庫, 共享庫裝載管理器在哪裡找到了需要的共享庫.

2. soname

共享庫的一個非常重要的,也是非常難的概念是 soname——簡寫共享目標名(short for shared object name)。這是一個為共享庫(.so)文件而內嵌在控制數據中的名字。如前面提到的,每一個程序都有一個需要使用的庫的清單。這個清單的內容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個清單。

soname 的關鍵功能是它提供了兼容性的標准。當要升級系統中的一個庫時,並且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運行。這個特性使得在 Linux 下,升級使用共享庫的程序和定位錯誤變得十分容易。

在 Linux 中,應用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。

查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關系

3. 共享庫裝載器

當程序被調用的時候,Linux 共享庫裝載器(也被稱為動態連接器)也自動被調用。它的作用是保證程序所需要的所有適當版本的庫都被調入內存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決於 Linux libc 的版本,它必須使用一點外部交互,才能完成自己的工作。然而它接受在環境變數和配置文件中的配置信息。

文件 /etc/ld.so.conf 定義了標准系統庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個設置,必須以 root 身份運行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個文件其實是裝載器內部使用的文件之一。

可以使用許多環境變數控制共享庫裝載器的操作(表1-4+)。

表 1-4+ 共享庫裝載器環境變數
變數 含義
LD_AOUT_LIBRARY_PATH 除了不使用 a.out 二進制格式外,與 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD 除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。
LD_KEEPDIR 只適用於 a.out 庫;忽略由它們指定的目錄。
LD_LIBRARY_PATH 將其他目錄加入庫搜索路徑。它的內容應該是由冒號
分隔的目錄列表,與可執行文件的 PATH 變數具有相同的格式。
如果調用設置用戶 ID 或者進程 ID 的程序,該變數被忽略。
LD_NOWARN 只適用於 a.out 庫;當改變版本號是,發出警告信息。
LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標准庫。
使用空格分開多個入口。對於設置用戶 ID 或者進程 ID 的程序,
只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
了全局版本號,該文件不遵守這個限制。

4. 使用 dlopen

另外一個強大的庫函數是 dlopen()。該函數將打開一個新庫,並把它裝入內存。該函數主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 伺服器利用這個函數在運行過程中載入模塊,這為它提供了額外的能力。一個配置文件控制了載入模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。

可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,並在 dl 庫中實現。它需要兩個參數:一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以後才載入的庫可以獲得其中的符號。

當庫被裝入後,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,並且調用裝載庫中的相應函數。

③ xcode使用方法

xcode使用方法:(以xcode5為例)


1,下載安裝好xcode5後,就可以開始ios開發之旅了。首先打開xcode。選擇新建一個xcode項目。

④ xcode是英文的,想改成中文,怎麼改

xcode改成中文的具體步驟如下:

1、首先我們先打開xcode

⑤ C++通過什麼編譯器編譯成的靜態庫給ios調用

用的是gcc編譯器或者xcode編譯就可以。
在開發過程中,經常會碰到一些在不同工程中經常用到的部分,把這些部分抽取出來做成一個靜態庫往往是一個比較好的做法。xcode里就有製作靜態庫的模板,相關的製作步驟網上也有很多,但在實際的操作中,還是有不少細節方面需要注意。以下是我碰到的一些問題總結。

1.編譯release版本的庫
在「Manage Schemes」中,將「Build Configuration」的選項改為「Release」即可。如圖:

2.靜態庫中包含category
如果你在靜態庫工程中使用了category,那麼你可能會碰到鏈接問題,解決的辦法就是需要同時在生成靜態庫的工程和使用靜態庫的工程中使用「-all_load」編譯選項,即在對應target的"Build Settings"中的「Other Linker Flags」選項添加「-all_load」。注意:使用靜態庫的工程中是一定要加該編譯選項的!!至於生成靜態庫的工程中加不加沒有試過,不過建議還是加上該編譯選項。

3.靜態庫支持的SDK版本
為了使自己的靜態庫盡可能多的支持IOS的系統版本,應該在"IOS Deployment Target"這個選項中選擇自己所需的IOS版本。設置如下圖,這個是我的靜態庫工程中的配置,紅框框起來的是我修改過的選項。

4.自動拷貝頭文件
在工程對應的target的「Build Phases」下添加「Copy Headers」的選項。該選項默認是沒有的,添加方法是點擊下方的「Add Build Phase」按鈕後選擇後即可添加。該選項下有3個子選項,分別是Public,Private,Project。通過點擊下方的加號,可以將工程中的頭文件添加到「Project」中,在其中的對應頭文件點擊右鍵,選擇「Move to Public Group」,當頭文件移到「Pulic」後,編譯工程以後,在工程編譯後.a文件所在的路徑下,會同時出現一個"usr/local/include"的文件夾,其中的頭文件就是public group中的頭文件。這時只需將.a文件和這個路徑下的頭文件拷貝到所需工程文件即可。
轉載

⑥ 如何調試iOS內核

標 題: 【原創】如何調試iOS內核
作 者: zhuliang
時 間: 2012-10-23,11:38:56

ios內核調試不像win和linux內核調試那麼簡易,操作起來比較麻煩,本文介紹如何進行ios內核的調試,word版如何調試iOS內核.rar.

如何調試iOS內核
作者:zhuliang
轉載請保證文章完整並註明來源
本文對如何調試iOS(iPhone OS)內核進行簡單的介紹,講述iOS內核調試的環境搭建,調試步驟等。
iOS是用XNU內核,XNU for mac的代碼可以從蘋果官方下載到,當然不是最新版的。XNU內核有既相互獨立又相互交互的三個組件構成,這三個組件是:Mach、BSD、IOKit。
首先,是硬體與軟體的准備。
硬體方面,一台越獄的設備是必需的,建議用iPhone4(注iPad2或iPhone4S由於採用的是蘋果A5的cpu,它的bootrom目前還沒有公開漏洞,不能用紅雪設置引導參數,不能使用它來調試)。內核調試數據線,該數據線含有USB轉串口的電路,可以參考文獻1來自己焊接,本人製作好的調試線如下圖,限於篇幅這里不對如何製作調試線展開討論。一台電腦,可為台式機或筆記本,mac更佳。

軟體方面,虛擬機VMware,mac操作系統比如Lion,XCode等。
其次,是環境的搭建。
Mac環境,由於iOS的內核調試要在mac操作系統平台下進行,所以首先要搭建mac環境,最好用真實的mac機,也可用虛擬機,本文為方便沒有mac的朋友,以虛擬機為例進行講述,用真實mac機的朋友可根據具體的情況隨機應變。具體步驟如下,先在電腦上裝虛擬機(如VMware)軟體,然後在虛擬機裡面裝mac操作系統(比如Lion),裝好mac系統後下載XCode並裝上。如果覺得這樣太麻煩的話,可直接從電驢下載裝好Lion的虛擬機。
有了mac環境後,在mac操作系統里裝好USB轉串口晶元的驅動程序(可從http://www.ftdichip.com/Drivers/VCP.htm下載),裝好驅動後就可用ls /dev/tty.usb*來看一下有沒有把串口識別出來。識別出來後如下面的圖所示。然後下載本文附帶的SerialKDPProxy程序源代碼SerialKDPProxy_m.rar(該源碼是由Albert_liuwei從參考文獻1提供的SerialKDPProxy修改而來,特此聲明),並make一下,你懂的。將得到的SerialKDPProxy文件cp到/bin下,這樣不用每次都要切換到這個目錄下才能執行。

最後,搭建好了環境後就可以進行調試了,主要有三個步驟:
一是運行串口代理程序,用下面的命令行。
SerialKDPProxy /dev/tty.usbserial-A900c0xb
這里的tty.usbserial-A900c0xb要替換為在你的系統上具體的設備名,上文ls /dev/tty.usb*的結果。
二是用紅雪設置引導參數。該步驟可以在物理主機Windows系統下面進行,因為命令行涉及到一個幾百M的文件,復制到虛擬機里比較麻煩。可以在Win下用下面的命令行。
redsn0w.exe -i "D:\Apple\iPhone3,1_4.3.3_8J2_Restore.ipsw" -j -a "-v debug=0x09"
該命令輸入完畢回車後,紅雪會讓你按它的提示進入dfu模式。進入dfu後稍等一下,會看到小菠蘿人在手機屏幕上。看不到的話,可能是進入dfu模式出錯。
接下來切換到mac環境工作,進入虛擬機環境之前要確認USB轉串口的設備前點的鉤已鉤上。如下圖:

三是用gdb調試ios內核。所用的命令行參數如下:

gdb -arch armv7 (gdb) target remote-kdp (gdb) attach 127.0.0.1
在win下面。串口從設備管理器里看出來是COM8.代理程序用這個命令行:./SerialKDPProxy.exe /dev/com8
啟動gdb的命令是 ./arm-apple-darwin-gdb.exe
其它的都是和se的ppt像一樣。
至於具體怎麼調試,熟悉linux下用gdb進行調試的朋友能相當熟練地調試,也可以參考本人的另一文章《iOS如何利用ARM的MMU進行地址映射》。

⑦ 如何學好OBJECTIVEC

1.請先把C語言基礎學好;
2.看《Programming in Objective-C 2.0》,不要看《Objective-C 2.0程序設計》;
3.看《Cocoa Design Patterns》和《Cocoa Programming Developer's Handbook》,不要因為他們很難而我們自己是初學者所以就不看;
4.是的,你需要一台Mac,如果你真的打算好好學Objective-C和Cocoa的話;
5.不要放過任何一個看上去很簡單的小編程問題——他們往往並不那麼簡單,或者可以引伸出很多知識點;
6.會用Objective-C,並不說明你會Cocoa編程;
7.學語法並不難,Foundation,Appkit,UIKit,Core Data,Core Animation也不過如此——難的是長期堅持實踐和不遺餘力的查閱文檔;
8.請時刻記住,要寫出好的App,界面設計和程序功能同等重要——其實可以時刻記住:Mac/iOS用戶界面規約也是必讀的文檔;
9.不看C語言的書,是學不好Objective-C語言的;
10.浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
11.浮躁的人容易問:我到底該學什麼;——別問,學就對了;
12.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;
13.浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
14.浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;
15.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;
16.Cocoa是Objective-C的框架,主要包括Foundation,Appkit和Core Data。Cocoa Touch是Cocoa的iOS版本,主要包括Foundation,UIKit和Core Data;
17.Objective-C不僅僅是為C加了個類——運行時環境同樣至關重要;
18.學習編程最好的方法之一就是閱讀文檔和源代碼,請善用Xcode文檔里的程序實例源代碼;
19.請記住,Objective-C是「動態」的語言;
20.請閱讀《Objective-C 2.0 Programming Language》等文檔——官方的文檔總是最權威,最完整的參考書;
21.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;
22.別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;
23.請記住,iOS和Mac開發本質上是相同的,不過區別也同樣要被重視;
24.不要停留在Xcode的層面上。掌握通過命令行使用gcc和gdb,以及git等工具,將使你效率倍增;
25.和別人一起討論有意義的Objective-C和Cocoa知識點,而不是爭吵Cocoa行不行或者Objective-C與C++哪個好;
26.不要被各種Core XXX等「技術」名詞所迷惑,它們只不過是C和Objective-C的框架(庫)而已;
27.如果你學過C++,請暫時忘記使用.(點)調用方法,Objective-C是用方括弧的,並且更准確的名字叫做「消息傳遞」;
28.Objective-C是C語言的嚴格超集,和C語言聯系緊密,C語言是Objective-C的一部分;
29.請不要認為學過C++語言再改學Objective-C就沒有什麼問題——你只不過又在學一門全新的語言而已;
30.讀完了《Cocoa Programming Developer's Handbook》以後再來認定自己是不是已經學會了Objective-C;
31.學習編程的秘訣是:編程,編程,再編程;
32.請留意下列書籍:《Cocoa Programming Developer's Handbook》《Cocoa Design Pattern》《iOS 4 Advaced Programming》《Cocoa Programming A Quick-Start Guide for Developers》;
33.不要因為蘋果是個商業公司,你就可以忘記開源。於個人來說,開源是給予,但你卻獲得了更多。別忘了,蘋果自己也使用了大量開源技術;
34.請把書上的程序例子親手輸入到電腦上實踐,即使配套光碟中有源代碼;
35.空閑的時候可以把自己的想法變成代碼,並放到github上去,或把它變成App Store里的一個軟體;
36.請重視Objective-C的運行時環境編程,並將其切實的運用到自己的程序中;
37.經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去;
38.不要漏掉書中任何一個練習題——請全部做完並記錄下解題思路;
39.Objective-C,Cocoa和Xcode集成開發環境要同時學習和掌握;
40.既然決定了學Objective-C,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;
41.工欲善其事,必先利其器,要做好Objective-C和Cocoa開發,請用好Xcode;
42.當你寫Cocoa程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43);
43.別心急,設計Objective-C的類確實不容易;自己程序中的類和自己的類設計水平是在不斷的編程實踐中完善和發展的;
44.決不要因為程序「很小」就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;
45.每學到一個Objective-C的難點的時候,嘗試著對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;
46.記錄下在和別人交流時發現的自己忽視或不理解的知識點;
47.請不斷地對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;
48.保存好你寫過的所有的程序——github是你最佳的代碼託管工具;
49.請不要做浮躁的人;
50.請熱愛Objective-C!

⑧ ios 如何開啟debug模式

Xcode的debug使用的是GDB調試器,只支持命令行操作的。在代碼中下斷點後,運行就可以了。

⑨ iOS 編譯報錯怎麼辦

1.編譯iPad真機時,選擇了 Architetures:Standard(armv6) BaseSDK:iPhoneDevice3.2 TargetDeviceFamily:iPad.

若編譯出現如下錯誤:

Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

則修改 GCC4.2CodeGeneral區域中的ComplieForThumb為非選中.

已經有了開發者證書及私鑰後,可直接在越獄的手機上調試.

2. 編譯鏈接時, "_OBJC_CLASS_$_xxx", referenced from:可能需要重新建立某個類的文件.

或者:選擇項目名,在detail列表中的target列(顯示為一個又圓圈),把這個文件的復選選中,或者再次選中.以把它加入到這個target裡面來.

3.在sdk4.0及以上使用RegexKitLite報'captureCount' was not declared in this scope錯誤,是在非.m文件中使用了它的原因.

4.there is no sdk with the name or path.

從網上down的開源代碼,結果運行的時候常出現這樣的錯,並且在deployment中沒有iosdeploymenttarget選項.

嘗試 Project/Edit Active Target/ 及 Set Active SDK菜單項,來回切換一下Active Configuration。

5. EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION錯誤,意味著這個app有內存管理的問題,一般是因為訪問野指針對象造成的。

一個和內存相關的崩潰一般很難定位到源代碼,因為這個惡魔可能很早就在程序中做了壞事了。假如一段有問題的代碼混亂了內存結構,這樣產生的蝴蝶效應可能會在之後很久才表現出來,並且總在不同的地方。所以,若有指針類型出現了不可能的變化,很可能就是因為內存結構被野指針調用混亂了。

修復一些警告後,可能就能預防一些內存錯誤。警告在左邊靠近行號的黃色三角指出一個編譯警告,你點擊那個黃色的三角形,xcode可能會彈出一個「Fix-it」的建議。

EXC_BAD_ACCESS崩潰不像SIGABRT,將不會得到很明朗的錯誤消息。然而可以使用一個讓人看到曙光的調試工具:Zombies!死亡對象工具。打開這個項目的scheme editor,選擇Run 選項,然後選擇Diagnosics標簽。勾上Enable Zombie Objects選項。當這個zombie工具被啟用之後,即使這個對象被釋放了,這個對象的內存也不會被清理。所以,那塊內存將會被標記為「長生不死的」。假如你試著之後又去使用這塊內存,這個app能夠意識到你的錯誤操作,並且app將會拋出「messagesent to daellocated instance」錯誤並且終止運行。

在工程中加入NSZombieEnabled 環境變數,並設為啟用,則在 EXC_BAD_ACCESS 發生時,XCode 的 Console 會列印出問題描述中,設置方法:雙擊Executables 下的 可執行模組,在彈出窗口中,Variables to be set in the environment,添加 NSZombieEnabled,並設定為 YES,點擊選中復選框啟用此變數。

可以再加入 MallocStackLogging 來啟用malloc記錄,以獲得更多的提示來幫助定位問題。

在gdb窗口輸入 (格式: shell malloc_history <id> <address>) shellmalloc_history1436 0x5f7fcf0, 也可以在終端中去運行 就要去掉以上的shell 指令 如 malloc_history <id> <address>

應該僅當需要調試內存時,才設置上述環境變數。

注意一點:不應該一直啟用zombie objects。因為這個工具將永遠不會釋放內存,只是簡單標記一下這個內存是不死的,你最終將會在某個時候耗盡所有的內存,因為所有分配過的內存都不會得到重用。因此應該在排查內存相關的錯誤的時候才開啟zombie objects,其他時候應該關閉它。

在xcode4中,To edit environment variables, go to Menu Proct / Edit Scheme…, select the desired configuration (you probably want 'Run') from the left sidebar first and then click on the Arguments tab. Environment variables are configurable there.

6.運行一個IPhone程序時,彈出窗口說「程序運行失敗,預置描述文件已過期」 。 解決辦法是,在Xcode中, window-> Orgnazier -> 你的iphone ->刪除帶有紅*的該程序之前的Profile 。 然後從Xcode運行該程序.

7.真機編譯時報 Code Sign error: The identity doesn't match any valid certificate/private key pair in the default keychain

修改工程和Targets的get infouild 中的code signing identity為空

8.調試列印

CFShow(coreFoundationThingy) will print out a description of coreFoundationThingy to the console. Output looks something like: {value = w:1186.000000 h:687.000000 type = kAXValueCGSizeType}

If NSLog() is printing something out as an NSCFType, try CFShow().

9. 編譯時報 Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1,修改C/C++ Compiler Version為gcc4.2

10.this class is not key value coding-compliant for the key viewController

可能在創建了一個基於view的工程,而後把生成的viewcontroller刪除了,但是在.xib中還有對它的引用,在IB中直接用delete鍵刪除掉它就行了。

11.這台電腦上已經存在一個名為「embedded.mobileprovision」的預置文件,您是否要替換么?

http://blog.sina.com.cn/s/blog_6907b67f0100o2vw.html

12.真機調試時報failed to upload *.app

http://hi..com/%CB%E6%B7%E7_1989/blog/item/9649f49f805f05aec8eaf466.html

http://www.shouyanwang.org/thread-462-1-1.html

13.記的release時,先置delegate為nil。

一個節點不應該保留任何對不屬於它的節點的引用。

14.模擬器

將xcode升級到4.3.1以後發現,ipad的模擬器,沒有Home鍵了。Command+Shift+H就可以實現類似點擊Home鍵的效果了。

⑩ ios開發中怎樣給xcode添加配置文件

本人覺得這個打包framework還是一個比較重要的功能,可以用來做一下事情: (1)封裝功能模塊,比如有比較成熟的功能模塊封裝成一個包,然後以後自己或其他同事用起來比較方便。 (2)封裝項目,有時候會遇到這個情況,就是一家公司找了兩個開發公司做兩個項目,然後要求他們的項目中的一個嵌套進另一個項目,此時也可以把唄嵌套的項目打包成framework放進去,這樣比較方便。 我們為什麼需要框架(Framework)? 要想用一種開發者友好的方式共享庫是很麻煩的。你不僅僅需要包含庫本身,還要加入所有的頭文件,資源等等。 蘋果解決這個問題的方式是框架(framework)。基本上,這是含有固定結構並包含了引用該庫時所必需的所有東西的文件夾。不幸的是,iOS禁止所有的動態庫。同時,蘋果也從Xcode中移除了創建靜態iOS框架的功能。 Xcode仍然可以支持創建框架的功能,重啟這個功能,我們需要對Xcode做一些小小的改動。 把代碼封裝在靜態框架是被app store所允許的。盡管形式不同,本質上它仍然是一種靜態庫。 框架(Framework)的類別 大部分框架都是動態鏈接庫的形式。因為只有蘋果才能在iOS設備上安裝動態庫,所以我們無法創建這種類型的框架。 靜態鏈接庫和動態庫一樣,只不過它是在編譯時鏈接二進制代碼,因此使用靜態庫不會有動態庫那樣的問題(即除了蘋果誰也不能在iOS上使用動態庫)。 “偽”框架是通過破解Xcode的目標Bundle(使用某些腳本)來實現的。它在表面上以及使用時跟靜態框架並無區別。“偽”框架項目的功能幾乎和真實的框架項目沒有區別(不是全部)。 “嵌入”框架是靜態框架的一個包裝,以便Xcode能獲取框架內的資源(圖片、plist、nib等)。 本次發布包括了創建靜態框架和“偽”框架的模板,以及二者的“嵌入”框架。 用哪一種模板? 本次發布有兩個模板,每個模板都有“強”“弱”兩個類別。你可以選擇最適合一種(或者兩種都安裝上)。 最大的不同是Xcode不能創建“真”框架,除非你安裝靜態框架文件xcspec在Xcode中。這真是一個遺憾(這個文件是給項目使用的,而不是框架要用的)。 簡單說,你可以這樣決定用哪一種模板: 如果你不想修改Xcode,那麼請使用“偽”框架版本 如果你只是想共享二進制(不是項目),兩種都可以 如果你想把框架共享給不想修改Xcode的開發者,使用“偽”框架版本 如果你想把框架共享給修改過Xcode的開發者,使用“真”框架版本 如果你想把框架項目作為另一個項目的依賴(通過workspace或者子項目的方式),請使用“真”框架(或者“偽”框架,使用-framework——見後) 如果你想在你的框架項目中加入其他靜態庫/框架,並把它們也鏈接到最終結果以便不需要單獨添加到用戶項目中,使用“偽”框架 “偽”框架 “偽”框架是破解的“reloacatable object file”(可重定位格式的目標文件, 保存著代碼和數據,適合於和其他的目標文件連接到一起,用來創建一個可執行目標文件或者是一個可共享目標文件),它可以讓Xcode編譯出類似框架的東西——其實也是一個bundle。 “偽框架”模板把整個過程分為幾個步驟,用某些腳本去產生一個真正的靜態框架(基於靜態庫而不是reloacatable object file)。而且,框架項目還是把它定義為wrapper.cfbundle類型,一種Xcode中的“二等公民”。 因此它跟“真”靜態框架一樣可以正常工作,但當存在依賴關系時就有麻煩了。 依賴問題 如果不使用依賴,只是創建普通的項目是沒有任何問題的。但是如果使用了項目依賴(比如在workspace中),Xcode就悲劇了。當你點擊“Link Binary With Libraries”下方的’+’按鈕時,“偽框架”無法顯示在列表中。你可以從你的“偽”框架項目的Procts下面將它手動拖入,但當你編輯你的主項目時,會出現警告: warning: skipping file '/somewhere/MyFramework.framework' (unexpectedfile type 'wrapper.cfbundle' in Frameworks & Libraries build phase) 並伴隨“偽”框架中的鏈接錯誤。 幸運的是,有個辦法來解決它。你可以在”Other Linker Flags”中用”-framwork”開關手動告訴linker去使用你的框架進行鏈接: -framework MyFramework 警告仍然存在,但起碼能正確鏈接了。 添加其他的庫/框架 如果你加入其他靜態(不是動態)庫/框架到你的“偽”框架項目中,它們將“鏈接”進你最終的二進制框架文件中。在“真”框架項目中,它們是純引用,而不是鏈接。 你可以在項目中僅僅包含頭文件而不是靜態庫/框架本身的方式避免這種情況(以便編譯通過)。 “真”框架 “真”框架各個方面都符合“真”的標准。它是真正的靜態框架,正如使用蘋果在從Xcode中去除的那個功能所創建的一樣。 為了能創建真正的靜態框架項目,你必需在Xcode中安裝一個xcspec文件。 如果你發布一個“真”框架項目(而不是編譯),希望去編譯這個框架的人必需也安裝xcspec文件(使用本次發布的安裝腳本),以便Xcode能理解目標類型。 注意:如果你正在發布完全編譯的框架,而不是框架項目,最終用戶並不需要安裝任何東西。 我已經提交一個報告給蘋果,希望他們在Xcode中更新這個文件,但那需要一點時間.OpenRadarlink here 加其他靜態庫/框架 如果你加入其他靜態(不是動態)庫/框架到你的“真”框架項目,它們只會被引用,而不會象“偽”框架一樣被鏈接到最終的二進制文件中。 從早期版本升級 如果你是從Mk6或者更早的版本升級,同時使用“真”靜態框架,並且使用Xcode4.2.1以前的版本,請運行uninstall_legacy.sh以卸載早期用於Xcode的所有修正。然後再運行install.sh,重啟Xcode。如果你使用Xcode4.3以後,只需要運行install.sh並重啟Xcode。 安裝 分別運行Real Framework目錄或Fake Framework目錄下的install.sh腳本進行安裝(或者兩個你都運行)。 重啟Xcode,你將在新項目向導的Framework&Library下看到StaticiOS Framework(或者Fake Static iOS Framework)。 卸載請運行unistall.sh腳本並重啟Xcode。 創建一個iOS框架項目 創建新項目。 項目類型選擇Framework&Library下的Static iOS Framework(或者Fake Static iOS Framework)。 選擇“包含單元測試”(可選的)。 在target中加入類、資源等。 凡是其他項目要使用的頭文件,必需聲明為public。進入target的Build Phases頁,Copy Headers項,把需要public的頭文件從Project或Private部分拖拽到Public部分。 編譯你的 iOS 框架 選擇指定target的scheme 修改scheme的Run配置(可選)。Run配置默認使用Debug,但在准備部署的時候你可能想使用Release。 編譯框架(無論目標為iOS device和Simulator都會編譯出相同的二進制,因此選誰都無所謂了)。 從Procts下選中你的framework,“show in Finder”。 在build目錄下有兩個文件夾:(yourframework).framework and (your framework).embeddedframework. 如果你的框架只有代碼,沒有資源(比如圖片、腳本、xib、coredata的momd文件等),你可以把(yourframework).framework 分發給你的用戶就行了。如果還包含有資源,你必需分發(your framework).embeddedframework給你的用戶。 為什麼需要embedded framework?因為Xcode不會查找靜態框架中的資源,如果你分發(your framework).framework, 則框架中的所有資源都不會顯示,也不可用。 一個embedded framework只是一個framework之外的附加的包,包括了這個框架的所有資源的符號鏈接。這樣做的目的是讓Xcode能夠找到這些資源。 使用iOS 框架 iOS框架和常規的Mac OS動態框架差不多,只是它是靜態鏈接的而已。 在你的項目中使用一個框架,只需把它拖僅你的項目中。在包含頭文件時,記住使用尖括弧而不是雙引號括住框架名稱。例如,對於框架MyFramework: #import 使用問題 Headers Not Found 如果Xcode找不到框架的頭文件,你可能是忘記將它們聲明為public了。參考“創建一個iOS框架項目”第5步。 No Such Proct Type 如果你沒有安裝iOS Universal Framework在Xcode,並企圖編譯一個universal框架項目(對於“真”框架,不是“假”框架),這會導致下列錯誤: target specifies proct type 'com.apple.proct-type.framework.static',but there's no such proct type for the 'iphonesimulator' platform 為了編譯“真”iOS靜態框架,Xcode需要做一些改動,因此為了編譯“真”靜態框架項目,請在所有的開發環境中安裝它(對於使用框架的用戶不需要,只有要編譯框架才需要)。 The selected run destination is not valid for this action 有時,Xcode出錯並載入了錯誤的active設置。首先,請嘗試重啟Xcode。如果錯誤繼續存在,Xcode產生了一個壞的項目(因為Xcode4的一個bug,任何類型的項目都會出現這個問題)。如果是這樣,你需要創建一個新項目重來一遍。 鏈接警告 第一次編譯框架target時,Xcdoe會在鏈接階段報告找不到文件夾: ld: warning: directory not found for option'-L/Users/myself/Library/Developer/Xcode/DerivedData/MyFramework-ccahfoccjqiognaqraesrxdyqcne/Build/Procts/Debug-iphoneos' 此時,可以clean並重新編譯target,警告會消除。 Core Data momd not found 對於框架項目和應用程序項目,Xcode會以不同的方式編譯momd(託管對象模型文件)。Xcode會簡單地在根目錄創建.mom文件,而不會創建一個.momd目錄(目錄中包含VersionInfo.plist和.mom文件)。 這意味著,當從一個embedded framework的model中實例化NSManagedObjectModel時,你必需使用.mom擴展名作為model的URL,而不是採用.momd擴展名。 NSURL *modelURL = [[NSBundle mainBundle]URLForResource:@"MyModel" withExtension:@"mom"]; Unknown class MyClass in Interface Builder file. 由於靜態框架採用靜態鏈接,linker會剔除所有它認為無用的代碼。不幸的是,linker不會檢查xib文件,因此如果類是在xib中引用,而沒有在O-C代碼中引用,linker將從最終的可執行文件中刪除類。這是linker的問題,不是框架的問題(當你編譯一個靜態庫時也會發生這個問題)。蘋果內置框架不會發生這個問題,因為他們是運行時動態載入的,存在於iOS設備固件中的動態庫是不可能被刪除的。 有兩個解決的辦法: 讓框架的最終用戶關閉linker的優化選項,通過在他們的項目的Other Linker Flags中添加-ObjC和-all_load。 在框架的另一個類中加一個該類的代碼引用。例如,假設你有個MyTextField類,被linker剔除了。假設你還有一個MyViewController,它在xib中使用了MyTextField,MyViewController並沒有被剔除。你應該這樣做: 在MyTextField中: + (void)forceLinkerLoad_ {} 在MyViewController中: +(void) initialize { [MyTextField forceLinkerLoad_]; } 他們仍然需要添加-ObjC到linker設置,但不需要強制all_load了。 第2種方法需要你多做一點工作,但卻讓最終用戶避免在使用你的框架時關閉linker優化(關閉linker優化會導致object文件膨脹)。 unexpected file type 'wrapper.cfbundle' in Frameworks &Libraries build phase 這個問題發生在把“假”框架項目作為workspace的依賴,或者把它當作子項目時(“真”框架項目沒有這個問題)。盡管這種框架項目產生了正確的靜態框架,但Xcode只能從項目文件中看出這是一個bundle,因此它在檢查依賴性時發出一個警告,並在linker階段跳過它。 你可以手動添加一個命令讓linker在鏈接階段能正確鏈接。在依賴你的靜態框架的項目的OtherLinker Flags中加入: -framework MyFramework 警告仍然存在, 但不會導致鏈接失敗。 Libraries being linked or not being linked into the finalframework 很不幸, “真”框架和“假”框架模板在處理引入的靜態庫/框架的工作方式不同的。 “真”框架模板採用正常的靜態庫生成步驟,不會鏈接其他靜態庫/框架到最終生產物中。 “假”框架模板採用“欺騙”Xcode的手段,讓它認為是在編譯一個可重定位格式的目標文件,在鏈接階段就如同編譯一個可執行文件,把所有的靜態代碼文件鏈接到最終生成物中(盡管不會檢查是否確實目標代碼)。為了實現象“真”框架一樣的效果,你可以只包含庫/框架的頭文件到你的項目中,而不需要包含庫/框架本身。 Unrecognized selector in (some class with a category method) 如果你的靜態庫或靜態框架包含了一個模塊(只在類別代碼中聲明,沒有類實現),linker會搞不清楚,並把代碼從二進制文件中剔除。因為在最終生成的文件中沒有這個方法,所以當調用這個類別中定義的方法時,會報一個“unrecognizedselector”異常。 要解決這個,在包含這個類別的模塊代碼中加一個“假的”類。linker發現存在完整的O-C類,會將類別代碼鏈接到模塊。 我寫了一個頭文件 LoadableCategory.h,以減輕這個工作量: #import "SomeConcreteClass+MyAdditions.h" #import "LoadableCategory.h" MAKE_CATEGORIES_LOADABLE(SomeConcreteClass_MyAdditions); @implementation SomeConcreteClass(MyAdditions) ... @end 在使用這個框架時,仍然還需要在Build Setting的Other Linker Flags中加入-ObjC。 執行任何代碼前單元測試崩潰 如果你在Xcode4.3中創建靜態框架(或庫)target時,勾選了“withunit tests”,當你試圖運行單元測試時,它會崩潰: Thread 1: EXC_BAD_ACCESS (code=2, address=0x0) 0 0x00000000 --- 15 dyldbootstrap:start(...) 這是lldb中的一個bug。你可以用GDB來運行單元測試。編輯scheme,選擇Test,在Info標簽中將調試器Debugger從LLDB改為GDB。

閱讀全文

與iosgdb命令相關的資料

熱點內容
湖南農信app怎麼導明細 瀏覽:471
福特abs編程 瀏覽:505
如何自學安卓手機 瀏覽:437
以太坊源碼共識機制 瀏覽:909
單片機探測器 瀏覽:869
demo編程大賽作品怎麼運行 瀏覽:50
學歷提升用什麼手機軟體App 瀏覽:938
apk反編譯弊端 瀏覽:451
編譯器內聯 瀏覽:910
圓形相框是什麼app 瀏覽:479
安卓微信如何設置文字加長 瀏覽:764
中科編譯科技公司高新技術企業 瀏覽:770
win7文件夾選項功能 瀏覽:90
微信文件夾為什麼會被鎖定 瀏覽:994
加密系列號 瀏覽:459
電冰箱換壓縮機要注意什麼 瀏覽:795
平板的訪客模式如何加密 瀏覽:139
釘釘加密有用嗎 瀏覽:112
加密u盤好還是不加密的 瀏覽:349
微觀經濟學平狄克第八版pdf 瀏覽:404