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.
- Install gdb
- Generate a certificate
- Sign certificate for gdb
- Create a gdb command file
- Generating builds
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.
Start by verifying whether you already have gdb installed on your system. Type the following in Terminal:
If you have gdb on your system already, you can skip to the Generate a certificate step. If you received an error, then you'll need to install gdb using Homebrew.
Verify whether or not you have Homebrew by typing:
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:
/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:
brew install gdb
You can confirm whether gdb is installed properly by running:
If everything went well then you're ready to move on to the next step!
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:
- Launch Keychain Access application: Applications > Utilities > Keychain Access.
- From the Keychains list on the left, right-click on the System item and select Unlock Keychain "System".
- From the toolbar, go to Keychain Access > Certificate Assistant > Create a Certificate.
- Choose a name (e.g. gdb-cert).
- Set Identity Type to Self Signed Root.
- Set Certificate Type to Code Signing.
- Check the Let me override defaults checkbox.
- 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.
- 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.
- Then, from the Keychains list on the left, right-click on the System item and select Lock Keychain "System".
- Finally, reboot your system.
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 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
You can find out for sure by typing the following in the terminal:
Replace <gdbPath> with your path to gdb.
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.
For this step, do one of the following.
- In the home directory, create a new file called .gdbinit. Write the following command into it and save:
set startup-with-shell off
- Type the following into the Terminal:
echo "set startup-with-shell off" >> ~/.gdbinit
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:
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):
and then from the gdb prompt, try creating a breakpoint:
You should see something like the following:
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!