工作需要用到跨平臺開發,原來都是先在windows下用vs2010開發,調試,調試好之後直接使用linux虛擬機進行編譯,然後在目標機上部署,但是遇到只在linux下才能運行的代碼就比較麻煩,有限的調試手段就是printf,有諸多的不便。
在逐漸摸索使用工具對目標機進行在線調試的過程中遇到很多的問題,記錄下來
從幾個方面進行嘗試。
1.使用vs進行跨平臺開發。
使用vs2019進行跨平臺開發,見另一篇文章
2.使用vscode配合gdb和gdbserver進行調試
我的想法是在目標機上運行gdbserver,然後使用vscode配合gdb進行調試。但是由於版本問題,遇到了非常多的問題,將問題記錄下來。
參考之前一篇 GDB和GDBServer
https://blog.csdn.net/jewelsu/article/details/102801789
我直接使用編譯環境的系統連接目標機使用gdb可以調試了。但是因爲是命令行工具,所以不太方便,所以希望掛上vscode來用
2.1 版本問題
爲什麼會有版本問題呢?因爲歷史原因,目標機使用的是centos6.4 x86架構。編譯環境也是一樣的,我稱爲編譯機。這兩個都不可更改。下面慢慢來將爲什麼這會成爲障礙
2.2vscode遠程調試
vscode是有遠程調試功能的,就是代碼可以在遠程,使用本地的vscode來編輯。如果這樣的話就可以使用vscode調用編譯環境下的代碼,然後直接使用編譯環境下的gdb配合目標機上的gdbserver調試了。
但是悲催的是vscode這個功能需要centos7+.
於是想到另一個方案,使用vscode remote wsl,在本機的wsl上運行gdb,目標機運行gdbserver。
2.3vscode使用remote wsl
https://blog.csdn.net/jewelsu/article/details/102811559
2.3.1 64位和32位的問題
使用wsl編譯了一個簡單的程序,在wsl上調試都沒有問題。但是我需要在wsl上運行可以在目標機上運行的程序,於是我用編譯機重新編了這個程序,在wsl上運行,失敗,報錯:
cannot execute binary file: Exec format error
後來想到,我的wsl是64位系統,而目標機和編譯機都是32位的,64位系統是不能直接執行32位程序的。
2.3.2在64位ubuntu上安裝32位庫
參考Ubuntu 14.04 64位系統兼容32位庫 https://blog.csdn.net/hpu11/article/details/81381246
dpkg --print-architecture 查看架構
dpkg --print-foreign-architectures 查看是否開啓32位兼容架構
sudo dpkg --add-architecture i386 增加32位架構
sudo apt-get update 更新列表
sudo apt-get -f dist-upgrade 更新程序
sudo apt-get install libc6:i386 libstdc++6:i386 安裝32位庫
仍然沒法運行。
2.3.3在64位ubuntu上編譯32位程序
經過一番折騰,我現在懷疑是不是因爲編譯環境的原因,編譯用到的庫版本不一致導致wsl執行不了我在目標機上運行的程序,那麼我直接在wsl上面編譯個32位程序,自己運行試一下呢
參考 看我linux(ubuntu)下的64位編譯器編譯32位程序 https://blog.csdn.net/msdnwolaile/article/details/50185103
sudo apt-get install gcc-multilib g++-multilib 安裝gcc的多平臺支持,否則會報錯找不到文件
編譯時增加選項-m32,編譯出來使用file命令查看就可以看到是32位的程序了
2.3.4讓wsl64位支持32位庫
非常悲催的是,經過了以上的折騰,還是運行不了,同樣的錯誤,這時候纔想到是不是因爲是wsl的原因。
查到一篇文章 WSL問題之32位程序運行 https://blog.csdn.net/u012742966/article/details/70307691
上面寫着
-------------------------------------------
普通的64位linux是有辦法運行32位的程序的
但是我經過大量的實驗,發現WSL上無法運行ELF 32-bit LSB executable 等32位程序
在這裏有官方說明
https://github.com/Microsoft/BashOnWindows/issues/390
Currently WSL only supports amd64 (native 64bit).
————————————————
這可如何是好,但是當我要灰心的時候,又看到一篇
讓win10的WSL子系統支持32bit程序 https://blog.csdn.net/shengerjianku/article/details/82290482
看來還是有希望的。
Presuming a fresh Ubuntu WSL instance, you'll need to install the qemu-user-static package, add the i386 binfmt, enable the i386 architecture, update your package lists, and install some i386 packages:
Install qemu and binfmt
-
sudo apt update
-
sudo apt install qemu-user-static
-
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
[Edit: whoops, need to update package lists, added sudo apt update
]
This will activate i386 support by causing them to be executed through qemu-i386-static, and drop a config file into /var/lib/binfmts/
for future reactivation.
You will need to reactivate this every time you restart WSL and want i386 support:
sudo service binfmt-support start
Enable i386 architecture and packages
-
sudo dpkg --add-architecture i386
-
sudo apt update
-
sudo apt install gcc:i386
顯然後面的步驟在2.3.2已經做了,
經過這個步驟,終於可以運行我的32位程序了。
2.3.5 wsl上運行gdb調試目標機程序
我在wsl上運行gdb,在目標機上運行gdbserver,開始能進去,但是打斷點之後運行,gdbserver就崩了,據我推測,gdb調用本機的信息來打斷點,但是遠端運行的庫與本機並不一致,所以就掛了。這個還需要進一步學習研究。
這條路又沒走通。
3.直接在編譯環境上安裝圖形界面的gdb工具來調試
看到這篇GDB圖形界面大PK https://blog.csdn.net/shenyuflying/article/details/53931865
篩選了可以用gdbserver的,準備使用insight試試。試用之後再補