VisualGDB是在vs上開發(fā)Linux程序的工具,利用visual studio強大的功能調試Linux程序真的是很愜意的一件事情。VisualGDB支持Linux的原理是,通過ssh連接到Linux系統(tǒng)上通過ssh給linux下達命令,既然需要Linux系統(tǒng),而VS又是Windows系統(tǒng),那么就需要一臺虛擬機。對于習慣了Windows下的開發(fā),覺得Linux下的純命令行開發(fā)調試,還是有些不習慣,效率有些低。那么能不能用VS來開發(fā)調試Linux程序呢,經過各種查找,找到了VisualGDB這個神奇的插件,通過VS+VisualGDB就可以編譯調試Linux程序。
將Crack下的VisualGDB.exe覆蓋安裝目錄下的文件,安裝路徑默認為C:\Program Files\Sysprogs\VisualGDB!
類似的工具還有VisualKernel 1.1r2 特別版版,Visual EmbedLinux Tools 0.1.6 官網最新版。
VisualGDB調試
1. 下載并安裝VisualGDB, 安裝完成后,在Visual Studio的目錄中可以看到Android選項:
2. 配置VisualGDB, 在Android -> Setup SDK/NDK location
主要配置JDK,SDK,NDK,ANT路徑
3. 設置要調試的apk包。Android -> Debug a Custom APK file
4 設置完成后,在代碼中設置斷點,點擊Debug, 開始調試
5. 等apk安裝完成后,程序會運行到斷點出,就可以開始用Visual Studio調試了
VisualGDB 使用教程
一準備工作
1 準備一臺Linux機器用來編譯程序,我用的是虛擬機安裝的CentOS網絡設置成橋接模式
(1)安裝并開啟SSH
(2)安裝 gcc g++ gdb
(3)關閉防火墻或者開啟允許SSH對外訪問的網絡端口
2下載 VisualGDB 安裝沒什么好說的一路next就好了,然后打開vs2008會需要配置VisualGDB也是一路next就好了
二用vs2008建立一個的linux程序
1 新建工程,然后我們選擇【VisualGDB】的【LinuxProject Wizard】
2 選擇【Create a newproject】的【Application】
3 建立SSH 鏈接 選擇【Build the projectunder Linux over network】
4選擇【Remotecomputer】的 【create a new SSH】輸入Linux電腦的ip地址以及用戶名密碼
5 接下去 next就好了 一個Linux工程就建好了
三創(chuàng)建和使用的靜態(tài)庫
1在剛剛的解決方案中新建工程
2 在新建項目時我們選擇【Static library】
3 一路next,我就建好了一個靜態(tài)庫文件
4 引用靜態(tài)庫,修改上一個建立的工程
#include <iostream>
#include "../Linux_static/Linux_static.h"
using namespace std;
int main(int argc, char *argv[])
{
char sz[] = "Hello, World!\n"; //Hover mouse over "sz" while debugging to see its contents
cout << "static library method :" << Linux_staticTest() << endl;
cout << sz << endl; //<================= Put a breakpoint here
return 0;
}
5 建立依賴關系
6 編譯 運行
四使用第三方的庫 以boost庫為例
1 在Linux上下載boost 并編譯,將boost頭文件拷貝到/usr/include 生成的so文件拷貝到/usr/lib 或者 /usr/lib64 (否則會編譯能通過但是運行不了)
2 vs2008上新建工程 右鍵選擇【VisualGDBProject Properties】
3 選擇Makefile settings
Include directory 第三方庫的頭文件
Library directory 第三方庫的庫文件
Library directory 所需用庫文件名字(注意:比如需要使用libboost_thread.so 時,只填boost_thread)
4 coding
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
void func(){
cout << "this is a thread !" << endl;
}
int main(int argc, char *argv[])
{
boost::thread th1(func);
th1.join();
char sz[] = "Hello, World!\n"; //Hover mouse over "sz" while debugging to see its contents
cout << sz << endl; //<================= Put a breakpoint here
return 0;
}
VisualGDB 初體驗:
2.1:創(chuàng)建一個帶有NativeC庫的Android APP。
File -> New -> Project ->VistualGDB -> Android Project Wizard
選擇Create a New App with a simple native library.
則會創(chuàng)建一個VS工程,這個工程包含Java文件和NativeC文件. C文件中包含JNI接口.
可以在C/C++ 程序中添加斷點調試.
2.2: 使用VisualGDB和Net ADB調試程序:
如果Android設備使用USB線和開發(fā)機連接,則使用VisualGDB直接可以調試之。 GDBServer也由VisualGDB從NDK中Push到遠端機器上。
但Sam在機頂盒項目中,使用網絡ADB而非USB connect ADB. 測試了一下,在adt-bundle-windows-x86_64-xxxx\sdk\platform-tools 目錄下,利用adb 連接遠端設備。
$adb.exe connect 10.0.0.7:5555
然后使用VisualGDB調試,則它會自動找到遠端設備并正常調試。贊一個。
2.3: 創(chuàng)建一個純NativeC 可執(zhí)行文件并調試:
選中Create a command-line Android executable.
其實這個就是常作的Android Native C 可執(zhí)行程序。
可以正常加斷點,Debug。
其它還可以Clone NDK的例子程序,打開Eclipse 工程的程序等都可以正常使用。
VisualGDB 進階:
在實際工作中,工程常是以下幾種情況,
NativeC可執(zhí)行程序依賴于 NativeC 動態(tài)或靜態(tài)庫。
Android App使用JNI調用NativeC的動態(tài)庫,這個動態(tài)庫又依賴于其它NativeC動態(tài)庫。
現(xiàn)就這兩種情況使用VisualGDB調試的情況嘗試一下。
3.1:NativeC可執(zhí)行程序調用NativeC 動態(tài)庫。
以Sam一個工程: V4L2_Utils為例。它由V4L2_Utils.cpp聲成一個動態(tài)庫。最終被Main.cpp所使用。
3.1.1:嘗試一:
創(chuàng)建了一個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目錄內的文件,不要自動加入Android.mk中編譯,如果需要,我們手動加入。
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放到jni目錄中。但不加入到工程中(否則會自動加入編譯)
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. 但這個辦法顯然不是好辦法。
因為調試時,只能調試主程序:TestNDK.cpp。 而無法調試動態(tài)庫。且debug時,VisualGDB甚至不會自動把動態(tài)庫push到開發(fā)板上。
3.1.2:嘗試二:
建立兩個工程,其中一個工程是Main.cpp生成可執(zhí)行程序。
另一個工程是V4L2_Utils.cpp生成 動態(tài)庫。
利用Vs工程的依賴方法讓第一個工程依賴于第二個。
編譯,一切正常。但可悲的是,visualGDB 還是不會自動把動態(tài)庫push上去。 且它竟然沒法export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
導致無法調試。
這兩個嘗試其實都是失敗的。難道VisualGDB只適合調試JNI下的NativeC庫?
嘗試三:
干脆把V4L2_Utils.cpp加入工程一。則不再生成動態(tài)庫,直接合并入可執(zhí)行文件中。這樣則可以調試。
但這顯然不是個好辦法。無法滿足真正的項目調試。