mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-02-01 11:15:13 +01:00
Formatting, remove whitespace
@@ -1,13 +1,12 @@
|
||||
# The information on this page is very outdated and concerns the mingw target only. Just use `lldb` for native builds.
|
||||
When debugging with `winedbg`, you probably found out that you can't:
|
||||
|
||||
When debugging with `winedbg`, you probably found out that you can't:
|
||||
1. Set break/watch points (not even using the literal address),
|
||||
2. Use debug symbols.
|
||||
|
||||
To debug OpenRCT2 with these features, a particularly strange setup has to be used. I've been searching for ways to debug cross-compiled MinGW executables, and finally found this StackOverflow post: https://stackoverflow.com/questions/3720434/can-gdb-be-used-on-a-cross-compiled-win32-application-on-the-target-platform
|
||||
|
||||
In summary, the setup is as follows:
|
||||
|
||||
1. Use a `gdbserver` executable compiled with **i686-w64-mingw32** as **host** (So when you've compiled `gdbserver`, the result is `gdbserver.exe`)
|
||||
2. Use a `gdb` executable compiled with **i686-w64-mingw32** as **target** (So the "host" is native)
|
||||
3. Start `gdbserver.exe` using wine, e.g.: `wine gdbserver.exe :0 openrct2.exe`
|
||||
@@ -19,17 +18,13 @@ In summary, the setup is as follows:
|
||||
After this, you can set breakpoints as you like!
|
||||
|
||||
### Compiling gdbserver and gdb
|
||||
|
||||
1. #### Compiling gdb
|
||||
|
||||
First, we compile gdb. To do this, we need a gcc compiler and the gdb source code. On later versions on OSX, gcc has been replaced with clang. So use a gcc compiler installed with MacPorts or HomeBrew. I used MacPorts' gcc49 package.
|
||||
|
||||
1. Grab the gdb source from GNU: https://www.gnu.org/software/gdb/download/. I used version 7.8.
|
||||
|
||||
2. Configure gdb using the following command **in the root directory**. That is, in the directory gcc-[version], **and not gcc-[version]/gcc**:
|
||||
|
||||
`$ CXX=g++-mp-4.9 CC=/opt/local/bin/gcc-mp-4.9 CFLAGS="-I/opt/local/include -L/opt/local/lib" ./configure --target=i686-w64-mingw32 --disable-werror`
|
||||
|
||||
```
|
||||
$ CXX=g++-mp-4.9 CC=/opt/local/bin/gcc-mp-4.9 CFLAGS="-I/opt/local/include -L/opt/local/lib" ./configure --target=i686-w64-mingw32 --disable-werror
|
||||
```
|
||||
I set the `CFLAGS` variable so that it also includes `/opt/local/include` and `/opt/local/lib` in its library/header search paths. These are for MacPorts, but you have to set it to the correct directory yourself if you use a different system.
|
||||
|
||||
Replace `gcc-mp-4.9` and `g++-mp-4.9` with your own C and C++ compilers.
|
||||
@@ -37,11 +32,9 @@ After this, you can set breakpoints as you like!
|
||||
3. Then, build it using `make`.
|
||||
|
||||
Running this, you may run into an error looking like this:
|
||||
|
||||
```
|
||||
Undefined symbols _bfd_mach_o_lookup_command in machoread.o
|
||||
```
|
||||
|
||||
This is because `bfd` (located in the subdirectory called `bfd`) hasn't been compiled with Mach-O, because we specified a custom target.
|
||||
|
||||
To workaround this problem, go to the `bfd` subdirectory, and run the same configure command above, except with `--enable-targets=all`. Then, still in the `bfd` subdirectory, run `make`.
|
||||
@@ -49,43 +42,38 @@ After this, you can set breakpoints as you like!
|
||||
When that's done, go to the top-level directory again (`cd ..`) and run make again. Now it should compile.
|
||||
|
||||
4. When it's done, you can find `gdb` in the `gdb` subdirectory. Place the executable wherever you want. I placed it alongside the other MinGW toolchain binaries. (located in `/usr/local/mingw-w32-bin_i686-darwin/bin` if you ran the `install.sh` script for OpenRCT2):
|
||||
|
||||
```
|
||||
$ sudo cp gdb /usr/local/mingw-w32-bin_i686-darwin/bin/i686-w64-mingw32-gdb
|
||||
```
|
||||
|
||||
5. (optional) For more ease of use, I also used `--with-sysroot=/path/to/your/.wine/drive_c` as option with the `configure` script. To do this, go to the gdb subdirectory and run the same configure command as above, but now additionally with `--with-sysroot=/path/to/your/.wine/drive_c`. Now, still in the `gdb` subdirectory, run `make` again.
|
||||
5. (optional) For more ease of use, I also used `--with-sysroot=/path/to/your/.wine/drive_c` as option with the `configure` script. To do this, go to the gdb subdirectory and run the same configure command as above, but now additionally with `--with-sysroot=/path/to/your/.wine/drive_c`. Now, still in the `gdb` subdirectory, run `make` again.
|
||||
|
||||
Having done this, you don't have to set the `sysroot` path everytime you start `gdb`. It will locate wine's DLLs automatically.
|
||||
|
||||
2. #### Compiling gdbserver
|
||||
|
||||
Next, we compile `gdbserver`. This should be relatively painless, unlike the previous step.
|
||||
|
||||
```
|
||||
$ cd gdb/gdbserver
|
||||
$ ./configure --host=i686-w64-mingw32
|
||||
$ make
|
||||
```
|
||||
|
||||
`i686-w64-mingw32-gcc` should be used automatically. If not, check if it's in your path.
|
||||
`i686-w64-mingw32-gcc` should be used automatically. If not, check if it's in your path.
|
||||
|
||||
The result is `gdbserver.exe`. I copied this to `/usr/local/cross-tools/i686-w64-mingw32/bin`, to keep everything organized.
|
||||
|
||||
### Running the server and connecting
|
||||
|
||||
1. To run the server:
|
||||
|
||||
`$ wine /path/to/gdbserver.exe :0 openrct2.exe`.
|
||||
|
||||
```
|
||||
$ wine /path/to/gdbserver.exe :0 openrct2.exe
|
||||
```
|
||||
2. Then, run gdb:
|
||||
|
||||
`$ i686-w64-mingw32-gdb openrct2.exe`
|
||||
|
||||
```
|
||||
$ i686-w64-mingw32-gdb openrct2.exe
|
||||
```
|
||||
3. Once in gdb, run:
|
||||
|
||||
`target remote :[gdbserver-port-number]`
|
||||
|
||||
```
|
||||
target remote :[gdbserver-port-number]
|
||||
```
|
||||
4. Be sure to load OpenRCT2 debug symbols, which are compiled with openrct2.dll:
|
||||
|
||||
`set solib-search-path`
|
||||
```
|
||||
set solib-search-path
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user