Setup gdb on macOS in 2020
Tags: gdb, macos, debug, cpp
Published: 2020-09-17 02:21:35

![gdb on macOS](https://dev-to-uploads.s3.amazonaws.com/i/u8xv0q71fips00xi0pbw.png)

Beginning with Mavericks (macOS 10.9) Xcode stopped supporting the gdb debugger. Below are steps to walk you through solving this not-so-straightforward problem.

## Table of Contents
* [Install gdb](#install-gdb)
* [Generate a certificate](#generate-cert)
* [Sign certificate for gdb](#sign-cert)
* [Create a gdb command file](#command-file)
* [Generating builds](#generate-builds)

### Install gdb <a name="install-gdb">
Open the Terminal app, Applications > Utilities > Terminal. This guide uses the Terminal throughout, so it's best to leave it open until you have finished all of the steps.

If you don't already have gdb on your system, then you'll need to install it. I'm going to show you how to install gdb by using [Homebrew](https://brew.sh/index.html).

Start by verifying whether you already have gdb installed on your system. Type the following in Terminal:
```bash
gdb --version
```

If you have gdb on your system already, you can skip to the [Generate a certificate](#generate-cert) step. If you received an error, then you'll need to install gdb using Homebrew. 

Verify whether or not you have Homebrew by typing:
```bash
brew --version
```

If Homebrew isn't already installed on your system, you'll need to install it. Using Terminal, type (or copy and paste) the following command:
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
Once Homebrew is installed, you can install gdb. The current version of gdb as of this writing is 9.2, which is confirmed working on Catalina as of Sept. 2020.

In order to install gdb type the command: 
```bash
brew install gdb
```
You can confirm whether gdb is installed properly by running:
```bash
gdb --version
```

If everything went well then you're ready to move on to the next step!

### Generate a certificate <a name="generate-cert">
If it was as simple as installing gdb, I wouldn't have made this guide! If you attempt to debug a file now, you will get errors and unexpected behavior because the Darwin kernel does not allow gdb to control another process without having special rights. Fortunately the rest of this guide walks you through all of the steps you'll need in order to use gdb effectively on your Mac.

In order to give gdb the permissions it needs, you'll need to generate a self-signed certificate.

Here are the steps:
1. Launch Keychain Access application: Applications > Utilities > Keychain Access.
2. From the Keychains list on the left, right-click on the System item and select Unlock Keychain "System".
3. From the toolbar, go to Keychain Access > Certificate Assistant > Create a Certificate.
4. Choose a name (e.g. gdb-cert).
5. Set Identity Type to Self Signed Root.
6. Set Certificate Type to Code Signing.
7. Check the Let me override defaults checkbox.
8. At this point, you can go on with the installation process until you get the Specify a Location For The Certificate dialogue box. Here you need to set Keychain to System. Finally, you can click on the Create button.
9. After these steps, you can see the new certificate under System keychains. From the contextual menu of the newly created certificate (right-click on it) select the Get info option. In the dialogue box, expand the Trust item and set Code signing to Always Trust.
10. Then, from the Keychains list on the left, right-click on the System item and select Lock Keychain "System".
11. Finally, reboot your system.

### Sign certificate for gdb <a name="sign-cert">
Now you'll need to sign the certificate. Create a file called __gdb-entitlement.xml__. This allows macOS to trust gdb operations for debugging. Type the following into the xml file you just created, and save it:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>
```
Now back in the Terminal app, navigate to the directory where you saved the xml file.
\*note. \<gdbPath\> in the following command is your path to gdb. It will be something like
/usr/local/Cellar/gdb/version/bin/gdb
or
/usr/local/bin/gdb.
You can find out for sure by typing the following in the terminal:
```bash
which gdb
```
Replace \<gdbPath\> with your path to gdb.
```bash
codesign --entitlements gdb-entitlement.xml -fs gdb-cert <gdbPath>
```
where gdb-cert is the name of the certificate you created earlier, and gdbPath is the full path to your gdb binary file.

### Create a gdb command file <a name="command-file">
For this step, do one of the following.
Either:
* In the home directory, create a new file called __.gdbinit__. Write the following command into it and save:
```bash
set startup-with-shell off
```
or 
* Type the following into the Terminal:
```bash
echo "set startup-with-shell off" >> ~/.gdbinit
```

### Generating builds <a name="generate-builds">
We're almost there! If you tried debugging with gdb now, you would likely receive a "No symbol table is loaded" error. In order to solve this, you'll need to compile programs with the -ggdb option, as in the following example:
```bash
gcc hello_world.c -o hello_world -ggdb.
```
At this point you should be able to successfully debug your programs on Mac using gdb. Do a test by running (for example):
```bash
gdb hello_world
```
and then from the gdb prompt, try creating a breakpoint:
```bash
(gdb)break main
```
You should see something like the following:
```bash
Breakpoint 1 at 0x100000de5: file hello_word.c, line 15.
```
I hope you're seeing the results you expected! Leave a comment and let me know how it goes!

Reference list:
* https://www.thomasvitale.com/how-to-setup-gdb-and-eclipse-to-debug-c-files-on-macos-sierra/

* https://coderwall.com/p/wyb2ug/how-fix-the-no-symbol-table-is-loaded-gdb-issue-on-mountain-lion