- How to debug windows executable in Linux
- 3 Answers 3
- gdbgui installation
- Method 1: Using pipx (recommended)
- Try Without Installing
- Method 2: Using pip
- Method 3: Download and Run Binary Executable
- System Dependencies for Python Package
- Linux Dependencies
- macOS Dependencies
- Windows Dependencies
- Кросс-компиляция и отладка C++ Windows-приложения под Linux
- Wine, не юникодное приложение, английский интерфейс Ubuntu и русский язык
- Настройка IDE Code::Blocks для кросс-компиляции и отладки
- Линкование статической библиотеки boost’а
How to debug windows executable in Linux
I am using Ubuntu 13.10. Is it possible to debug a windows executable under Linux? I’ve tried gdb, but it always throw me this error message.
/bin/bash: line 0: exec: /some.exe: cannot execute: Permission denied
3 Answers 3
I don’t have much experience with this but, I think, what you’re looking for is winedbg. Initially, it should allow you to debug Win32 applications in Linux.
I suggest you try the IDA Debugger (cross platform debugger).
Hope it helps.
You are trying to execute a program designed to run in a OS, from within another one, which could be using a complete different processor than a x86.
In order for a executable program to be run in a specific OS, these modules or services must exist:
- A module that can understand the binary code of the executable program and translate, if needed, into binary code of the host processor.
- A service that can intercept any instruction identified as a system call, and emulate its behaviour using host resources
- A module that is able to load, parse and prepare a process block to acommodate the new «guest» process
This is just for executing a program. To debug it, you also need a service that can interact with the above mentioned modules/services in order to control execution of that program.
That said, you can probably debug an EXE file using some utility from the Wine project, asumming your Ubuntu is running on a x86 processor. Take a look at it. http://www.winehq.org/
Also, I recall VirtualBox offers some sort of debugging help for processes running on the guest OS, but I’m not sure about this.
gdbgui installation
There are a few ways to install gdbgui on your machine. There is even a way to run gdbgui without installing it. Read on to to find the one that’s right for you.
Method 1: Using pipx (recommended)
gdbgui recommends using pipx, a program to run Python CLI binaries in isolated environments.
You can install pipx like this:
python3 -m pip install --user pipx python3 -m userpath append ~/.local/bin
Restart/re-source your console to make sure the userpath is up to date.
Then, install gdbgui with pipx:
When installation is finished, type gdbgui from the command line to run it, or gdbgui -h for help.
Try Without Installing
By using pipx, you can run Python CLI programs in ephemeral one-time virtual environments.
A new tab running the latest version of gdbgui will open in your browser. Press CTRL+C to end the process, and your system will remain untouched.
Method 2: Using pip
pip is a popular installer for Python packages. gdbgui is a Python package and as such can be installed with pip, though we recommend using pipx rather than pip if possible.
If you prefer to use Virtual Environments, you can activate one and then run
You can get upgrades with
pip install --upgrade gdbgui
Method 3: Download and Run Binary Executable
Download and run the binary executable for your system from GitHub Releases.
System Dependencies for Python Package
Note that this only applies if you are installing the Python package, and not using the binary executable.
Linux Dependencies
sudo apt-get install gdb python3
macOS Dependencies
brew install python3 brew install gdb --with-python --with-all-targets
macOS users must also codesign gdb: follow these instructions. This will fix the error please check gdb is codesigned — see taskgated(8) .
Windows Dependencies
Note that windows is only supported for gdbgui versions less than 0.14.
If you do not have already have gdb/make/gcc installed, there are two options to install them on Windows: MinGW and cygwin .
MinGW (recommended)
Minimal GNU for Windows ( MinGW ) is the recommended Windows option. Install MinGW with the «MinGW Base System» package. This is the default package which contains make , gcc , and gdb .
It will install to somewhere like C:\MinGW\bin\. . For example C:\MinGW\bin\gdb.exe , C:\MinGW\bin\mingw32-make.exe , etc.
Ensure this MinGW binary directory (i.e. C:\MinGW\bin\ ) is on your «Path» environment variable: Go to Control Panel > System Properties > Environment Variables > System Variables > Path and make sure C:\MinGW\bin\ is added to that list. If it is not added to your «Path», you will have to run gdbgui with the path explicitly called out, such as gdbgui -g C:\MinGW\bin\gdb.exe .
Cygwin
Cygwin is a more UNIX-like compatibility layer on Windows, and gdbgui works with it as well.
When installing cygwin packages, add the following:
Кросс-компиляция и отладка C++ Windows-приложения под Linux
Показали мне недавно интересное приложение, под которое можно разрабатывать плагины. Приложение оказалось очень полезным для научной работы, но вот незадача — приложение разработано под Windows, у меня стоит Ubuntu. Windows для разработки под это приложение от лаборатории получить пока не удалось. Чтобы не тратить время, решил освоить кросс-компиляцию и отладку этого приложения.
Итого, имеется:
Ubuntu 12.10 x64
Не-юникодное приложение Мастерская Граф-Моделей (МГМ) (В командах консоли будет называться gmw.exe)
Нужно:
Разрабатывать и отлаживать плагины (dll-библиотеки), не устанавливая Windows.
И тут нам помогут Wine, Code::Blocks, портированное GDB, и boost.
Wine, не юникодное приложение, английский интерфейс Ubuntu и русский язык
получаются зюки следующего вида:
На эту проблему интернет очень быстро дает следующую подсказку:
LC_ALL=ru_RU.UTF-8 wine gmw.exe
В моём случае, данный подход не улучшил ситуацию ни на йоту.
Как выяснилось, русских локалей в системе не было добавлено (тыц).
sudo echo "ru_RU.UTF-8 UTF-8" >> /var/lib/locales/supported.d/ru sudo locale-gen ru
LC_ALL=ru_RU.UTF-8 wine gmw.exe
И, вуаля, запускается приложение с читаемым русским текстом:
Настройка IDE Code::Blocks для кросс-компиляции и отладки
Установка Code::Blocks
В дальнейшем для отладки нам потребуется менять код плагина отладки поэтому лучше сразу взять версию Code::Blocks из под svn.
Устанавливаем svn:
sudo apt-get install subversion
С помощью svn получаем код C::B, для этого переходим в папку, в которую хотим сохранить код C::B, где и набираем:
svn checkout svn://svn.berlios.de/codeblocks/trunk
Переходим в полученную папку ‘trunk’.
Компиляция C::B происходит с помощью g++, autotools, automake и некоторых других утилит, которые необходимо установить:
sudo apt-get install libtool autotools-dev automake autoconf g++ libhunspell-dev libgtk2.0-dev libgamin-dev libboost-dev
sudo apt-get install libwxgtk2.8-dev
И дальше, устанавливаем сам codeblocks (ключ —prefix можно упустить для использования настроек по-умолчанию):
sudo ./configure --prefix= --with-contrib-plugins=all sudo make sudo make install
Более подробно можно посмотреть по ссылке.
Настройка компиляции и линковки
Выполняем пункты с 1 по 5 с форума Code::Blocks. После этого компиляция программ должна работать, если не используется линковка к платформо-зависмым библиотекам (линковка с boost::regexp будет рассмотрена позже).
(*) В новом Code::Blocks немного изменилось меню по сравнению с инструкцией. Настройки искать нужно в ‘Settings->Compiler. ‘. Для старого Code::Blocks (10.05) пункт 5 нужно выполнить полностью, для нового же (12.11) настройку касающуюся gdb в 5 пункте пока трогать не будем.
Если используется boost его лучше положить отдельно от /usr/include, т.к. по этому адресу лежит много linux-специфичных заголовочных файлов, которые мы не хотим включать в проект при компиляции под Windows.
UPD: При настройке линковки в поле «Other Linker Options» имеет смысл добавить опцию «-Wl,—subsystem,windows,—kill-at», которая помечает, что это реально Windows DLL, и, что самое главное, запрещает использовать декорирование символов (—kill-at) при экспорте функций с соглашением вызова __stdcall. Подрбнее здесь и здесь.
Начиная с пункта 7 по ссылке выше, описывается кросс-отладка, но, к сожалению, insight.exe, упоминающийся в инструкциях, найти не удается. Поэтому пойдем своим путем.
Кросс-отладка в Code::Blocks & MingW32 gdb для Windows
gdb, который является родным для линукса частично умеет отлаживать Windows приложения, правда, умеет он только останавливаться на исключениях и почти всегда игнорирует точки останова. Чтобы справиться с этими проблемами скачиваем gdb в пакете mingw32 под Windows. Для этого скачиваем и затем распаковываем и переходим в подпапку ‘bin’. Устанавливаем gdb под Windows:
wine mingw-get.exe install gdb
Теперь в этой же папке bin появился файл gdb.exe, он-то нам и нужен.
Создаем скрипт для имитации обычного gdb для этого в файл /usr/bin/i586-mingw32msvc-gdb
sudo gedit /usr/bin/i586-mingw32msvc-gdb
Для старого C::B все уже настроенно, для нового же отладчик нужно настроить дополнительно. В пункте ‘Settings->Debugger’ кликаем по ‘GDB/CDB debugger’ затем по ‘Create Config’. В новом конфиге меняем команду запуска отладчика на ‘/usr/bin/i586-mingw32msvc-gdb’, остальные настройки по желанию. После этого идем в ‘Settings->Compiler. «, в пункте ‘Selected Compiler’ выбираем тот компилятор, который настраивали до этого и затем на вкладке ‘Toolchain executables’ меняем ‘Debugger’ на наш свежесозданный конфиг. Теперь отладчик будет останавливаться на точках останова, хотя и остановить программу в произволльный момент не сможет (данная проблема пока еще не решена). Правда при попытке отладить,C::B выдает следующую ошибку:
The program has stopped on a breakpoint but the breakpoint format is not recognized: 0x1A0x1AZ:/SamplePlugin.cpp:48:948:beg:0x68087599
Эта ошибка говорит о том, что плагин отладчика в C::B не понимает выдачу отладчика gdb.exe. Как выяснилось при ближайшем рассмотрении плагин отладчика имеет платформо-зависимый код, и вот тут-то и нужно вспомнить что у нас есть исходники C::B. Мы сейчас слегка подкоррекируем код этого плагина. Нужно будет поменять код только одного файла ‘/src/plugins/debuggergdb/gdb_driver.cpp’
Для этого нужно перейти в корень проекта C::B (откуда запускалась команды ./bootstrap), по умолчанию это папка ‘trunk’. И накактить патч:
patch --unified --strip=0 --forward --input=gdb_driver.cpp.patch
sudo ./configure --prefix= --with-contrib-plugins=all sudo make sudo make install
И почти все готово, остается только создать проект. Шаги 12-13 по ссылке. Если же вы хотите создать проект dll-библиотеки, то указывайти создание динамической библиотеки в мастере и переименовывайте разширение в dll.
Проверям, что в настройках проекта стоит выбранная нами цепь компилятор-линкер-отладчик. ‘-Build Options. ‘ пункт ‘Selected compiler’, и можно радоваться и отлаживаться. Напомню, что по какой-то причине отладчик не может быть прерван во время исполнения, т.е. все отладочные действия могут буть применены только во время останова программы. В частности нельзя поставить новую точку останова, если программа не стоит на какой-либо другой точке останова…
Линкование статической библиотеки boost’а
Библиотека boost в основном является набором заголовочных файлов, и потому никаких проблем с линковкой обычно не возникает. Но для некоторых частей boost’а необходимо линковаться к статической библиотеке, например, boost::regex. Пробуем собрать проект и получаем:
/boost/regex/v4/cpp_regex_traits.hpp|1059|undefined reference to `boost::scoped_static_mutex_lock::scoped_static_mutex_lock(boost::static_mutex&, bool)'
Ошибка возникает из-за того, что мы пытаемся прилинковаться к linux билиотеке, для того чтобы построить windows-приложение.
Чтобы слинковаться нужно скомпилировать boost::regex с помощью MingW32 (про кросс-компиляцию). Скачиваем boost, распаковываем и переходим в папку с распаковынным boost’ом. Создаем файл user-config.jam в корне домашней директории:
using gcc : : i586-mingw32msvc-g++ ;
sudo ./bootstrap.sh --with-libraries=regex --without-icu sudo ./b2
После выполнения последней команды у меня были ошибки «failed updating 1 target», что, правда, не мешает собираться программам.
В результате, у нас есть полностью подготовленная среда для написания, сборки и отладки Windows-приложений или Windows-библиотек из под Linux. Теперь можно приступать к работе…