GDB

GDB #

GDB 的主要功能就是监控程序的执行流程,

只有当源程序文件编译为可执行文件并执行时,GDB 才会派上用场。

# -g  Generate source-level debug information
$ gcc -g main.c -o main

# 启动时不显示提示信息
# -q, --quiet, --silent
$ gdb -q

# 显示 gdb 版本信息
(gdb) show version
# 查看 gdb 版权相关信息
(gdb) show copying

# 输出信息多时不会暂停输出
(gdb) set pagination off

# 列出函数的名字
(gdb) info functions
(gdb) info functions regex

GDB 常用的调试指令 #

调试指令 作 用
(gdb) break xxx
(gdb) b xxx
在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。
(gdb) run
(gdb) r
执行被调试的程序,其会自动在第一个断点处暂停执行。
(gdb) continue
(gdb) c
当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。
(gdb) next
(gdb) n
令程序一行代码一行代码的执行。
(gdb) print xxx
(gdb) p xxx
打印指定变量的值,其中 xxx 指的就是某一变量名。
(gdb) list
(gdb) l
显示源程序代码的内容,包括各行代码所在的行号。
(gdb) quit
(gdb) q
终止调试。

问题 #

解决 GDB 在 Mac 下不能调试的问题 #

Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。 调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名。

创建代码签名的证书 #

  1. 打开 Keychain Access 应用程序(/Applications/Utilities/Keychain Access.app)
  2. 执行菜单   钥匙串访问  ->  证书助理  ->  创建证书
  3. 填写如下信息:
    • 名称:gdb_codesign
    • 身份类型:自签名根证书
    • 证书类型:代码签名
    • 钩选:让我覆盖这些默认设置
  4. 一路确定,直到指定证书位置的步骤,选择系统
  5. 点击 “创建”,会提示用输入系统登录密码,创建完成
  6. 在钥匙串访问程序中,选择左侧栏的系统和我的证书,找到你刚刚创建的  gdb_codesign  证书并双击打开证书信息窗口,展开   信任项,设置使用此证书时:为始终信任。
  7. 关闭证书信息窗口,系统会再次要求输入系统登录密码。

签名 #

如果是之前的系统,直接执行:
codesign -fs gdb-cert $(which gdb)

如果是 Mojave (10.14) 之后的系统,
先创建一个文件  gdb-entitlement.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.debugger</key>
    <true/>
</dict>
</plist>
</pre>

再执行:
codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

具体参考这里:https://sourceware.org/gdb/wi…

参考:


工具 #

cyrus-and/gdb-dashboard Github stars Language Last Tag Last commit


本文访问量

本站总访问量

本站总访客数