直接使用VS(VisualStdio)對Android,Linux,樹莓派,ARM等進(jìn)行代碼編輯,編譯,調(diào)試 VS的功能之強(qiáng)大,地球人都知道,VisualGDB+Visual Studio。VisualGDB整合了GNU Toolchain(GCC/GDB)進(jìn)Visual Studio。 這樣就可以直接使用Visual Studio開發(fā)和調(diào)試一些基于GNU Toolchain的各平臺應(yīng)用程序。例如:嵌入式程序,Android Native Code,MacOS Driver,Linux Driver, Linux Application等。
VisualGDB是德國一家公司Sysprogs UG開發(fā)的。
gdb調(diào)試工具(VisualGDB)把GDB調(diào)試工具集成到visual studio 開發(fā)環(huán)境中,在調(diào)試過程中,可以使用visual studio原有的單步執(zhí)行、設(shè)定斷定等快捷鍵,還可以在visual GDB session的窗口中輸入GDB的調(diào)試命令,集成了visualGDB之后還可以在程序執(zhí)行的過程中用鼠標(biāo)懸停的方式查看和修改變量的值,這樣在不改變調(diào)試習(xí)慣的同時(shí)還可以使用GDB強(qiáng)大的調(diào)試功能,很不錯(cuò)。
除了調(diào)試windows項(xiàng)目之外,visualGDB還可以在visual studio中調(diào)試android項(xiàng)目,linux項(xiàng)目。只不過調(diào)試linux項(xiàng)目的時(shí)候是通過ssh登陸的方式進(jìn)行遠(yuǎn)程調(diào)試,也就是說基于網(wǎng)絡(luò)的,至少是雙機(jī)。
使用方法
1.安裝VisualGDB-5.0-beta2.msi
2.將VisualGDB.exe覆蓋安裝目錄下的文件,安裝路徑默認(rèn)為C:\\Program Files\\Sysprogs\\VisualGDB
安裝教程:
目前已知的VisualGDB免費(fèi)版最新版是VisualGDB-5.0-beta2,具體的話可以簡介的百度云中下載;
點(diǎn)擊并安裝 VisualGDB-5.0-beta2.msi
選擇正確的版本的Visual Studio,,如下圖所示,我當(dāng)前選擇的是Visual Studio 2013
安裝完后用"VisualGDB.exe"替換掉安裝目錄下面的VisualGDB.exe,如我的完整的路徑是"D:\Program Files (x86)\Sysprogs\VisualGDB\VisualGDB.exe",具體的如下圖所示:
打開Visual Studio 2013,便可以開始新建一個(gè)Android Project,具體的效果如下:
雖然界面上顯示的是jdk32位的,但是實(shí)際上都用64位的版本的也是可以的,效果如下圖所示:
可以新建一個(gè) App 試試:
調(diào)試效果如下圖所示:
當(dāng)然可以導(dǎo)入一個(gè)已經(jīng)存在的eclipse工程,效果如下:
java環(huán)境配置:
1. 配置JDK
打開【我的電腦】屬性-【高級系統(tǒng)設(shè)置】-【環(huán)境變量】如下圖:
1) 第一“JAVA_HOME”:JAVA_HOME的內(nèi)容是jdk安裝目錄。如小編安裝的位置C:\Program Files (x86)\Java\jdk1.7.0_60,并且后邊不帶分號,如下圖:
2) 第二,檢查CLASSPATH,這是一個(gè)jar包的調(diào)用。.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(前面有點(diǎn)號和分號,后邊結(jié)尾也有分號。或者可以寫成“.;%JAVA_HOME%\lib”如圖所示,一樣的效果。如下圖:
3) 第三檢查“PATH"變量是否正確,PATH變量很簡單,就是jdk的bin目錄的意思。%JAVA_HOME%\bin;
4) 安裝了JDK的話,正常CMD下輸入JAVAC時(shí)一定可以成功的。就會(huì)有如下信息提示
VisualGDB 初體驗(yàn):
2.1:創(chuàng)建一個(gè)帶有NativeC庫的Android APP。
File -> New -> Project ->VistualGDB -> Android Project Wizard
選擇Create a New App with a simple native library.
則會(huì)創(chuàng)建一個(gè)VS工程,這個(gè)工程包含Java文件和NativeC文件. C文件中包含JNI接口.
可以在C/C++ 程序中添加斷點(diǎn)調(diào)試.
2.2: 使用VisualGDB和Net ADB調(diào)試程序:
如果Android設(shè)備使用USB線和開發(fā)機(jī)連接,則使用VisualGDB直接可以調(diào)試之。 GDBServer也由VisualGDB從NDK中Push到遠(yuǎn)端機(jī)器上。
但Sam在機(jī)頂盒項(xiàng)目中,使用網(wǎng)絡(luò)ADB而非USB connect ADB. 測試了一下,在adt-bundle-windows-x86_64-xxxx\sdk\platform-tools 目錄下,利用adb 連接遠(yuǎn)端設(shè)備。
$adb.exe connect 10.0.0.7:5555
然后使用VisualGDB調(diào)試,則它會(huì)自動(dòng)找到遠(yuǎn)端設(shè)備并正常調(diào)試。贊一個(gè)。
2.3: 創(chuàng)建一個(gè)純NativeC 可執(zhí)行文件并調(diào)試:
選中Create a command-line Android executable.
其實(shí)這個(gè)就是常作的Android Native C 可執(zhí)行程序。
可以正常加斷點(diǎn),Debug。
其它還可以Clone NDK的例子程序,打開Eclipse 工程的程序等都可以正常使用。
VisualGDB 進(jìn)階:
在實(shí)際工作中,工程常是以下幾種情況,
NativeC可執(zhí)行程序依賴于 NativeC 動(dòng)態(tài)或靜態(tài)庫。
Android App使用JNI調(diào)用NativeC的動(dòng)態(tài)庫,這個(gè)動(dòng)態(tài)庫又依賴于其它NativeC動(dòng)態(tài)庫。
現(xiàn)就這兩種情況使用VisualGDB調(diào)試的情況嘗試一下。
3.1:NativeC可執(zhí)行程序調(diào)用NativeC 動(dòng)態(tài)庫。
以Sam一個(gè)工程: V4L2_Utils為例。它由V4L2_Utils.cpp聲成一個(gè)動(dòng)態(tài)庫。最終被Main.cpp所使用。
3.1.1:嘗試一:
創(chuàng)建了一個(gè)Native C可執(zhí)行程序,注意,在Automatic Android.mk updating: 中選擇:
The JNI folder contains multiple libraries or conditional stantements. You will have to edit android.mk manually.
也就是說,JNI目錄內(nèi)的文件,不要自動(dòng)加入Android.mk中編譯,如果需要,我們手動(dòng)加入。
1. 修改Application.mk為Sam常用模式。
# Build both ARMv5TE and ARMv7-A machine code.
APP_PLATFORM = android-8
APP_ABI := armeabi-v7a
#APP_ABI := $(ARM_ARCH)
#Sam modify it to release
#APP_OPTIM := release
APP_OPTIM := debug
#APP_OPTIM = $(MY_OPTIM)
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -frtti
#sam modify it from gnustl_static to gnustl_shared
#APP_STL := gnustl_static
#APP_STL := gnustl_shared
APP_STL := gnustl_shared
#APP_CPPFLAGS += -fno-rtti
#
APP_CPPFLAGS += -Dlinux -fsigned-char
APP_CFLAGS += -fsigned-char
2. 把V4L2_utils.cpp, V4L2_Utils.h放到j(luò)ni目錄中。但不加入到工程中(否則會(huì)自動(dòng)加入編譯)
3. 修改Android.mk
# Generated by VisualGDB
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestNDK
LOCAL_ARM_MODE := arm
#VisualGDBAndroid: AutoUpdateSourcesInNextLine
LOCAL_SRC_FILES := TestNDK.cpp
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS :=
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_LDFLAGS :=
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
LOCAL_STATIC_LIBRARIES := Camera_V4L2
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := Camera_V4L2
LOCAL_SRC_FILES := v4l2_util.cpp
LOCAL_CXXFLAGS := -D_GLIBCXX_USE_WCHAR_T -I./
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
編譯,果然生成libCamera_V4L2.so , 和TestNDK. 但這個(gè)辦法顯然不是好辦法。
因?yàn)檎{(diào)試時(shí),只能調(diào)試主程序:TestNDK.cpp。 而無法調(diào)試動(dòng)態(tài)庫。且debug時(shí),VisualGDB甚至不會(huì)自動(dòng)把動(dòng)態(tài)庫push到開發(fā)板上。
3.1.2:嘗試二:
建立兩個(gè)工程,其中一個(gè)工程是Main.cpp生成可執(zhí)行程序。
另一個(gè)工程是V4L2_Utils.cpp生成 動(dòng)態(tài)庫。
利用Vs工程的依賴方法讓第一個(gè)工程依賴于第二個(gè)。
編譯,一切正常。但可悲的是,visualGDB 還是不會(huì)自動(dòng)把動(dòng)態(tài)庫push上去。 且它竟然沒法export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
導(dǎo)致無法調(diào)試。
這兩個(gè)嘗試其實(shí)都是失敗的。難道VisualGDB只適合調(diào)試JNI下的NativeC庫?
嘗試三:
干脆把V4L2_Utils.cpp加入工程一。則不再生成動(dòng)態(tài)庫,直接合并入可執(zhí)行文件中。這樣則可以調(diào)試。
但這顯然不是個(gè)好辦法。無法滿足真正的項(xiàng)目調(diào)試。