调试程序
开启 debug
cmake
debug 模式:
cmake -DCMAKE_BUILD_TYPE=Debug ..
release 模式:
cmake -DCMAKE_BUILD_TYPE=Release ..
CMAKE_BUILD_TYPE 的可能的值有 Debug, Release, RelWithDebInfo, MinSizeRel 等。
还可以通过在 CMakeLists 中添加
CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
来修改或添加 flags。set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall") set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")
qmake
qmake CONFIG+=debug ${qmake_options} make ${make_options}
coredump
查看 core 文件存储位置和名称
$ cat /proc/sys/kernel/core_pattern |/usr/share/apport/apport %p %s %c %P $ cat /proc/sys/kernel/core_uses_pid #用于控制产生的 core 文件的文件名中是否添加 pid 作为扩展,如果添加则文件内容为 1,否则为 0
修改 core 位置
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
在这条命令中,/data/coredump 是你自己指定的存放 coredump 文件的路径,所有产生的 coredump 文件将会存放在这里,%e 表示程序的文件名,%p 表示进程的 ID(当然还有一些其他的参数可以设置,例:%t 显示创建的时间),但是前提要把目录/data/coredump 创建好,不然无法生成文件
%p - insert pid into filename 添加pid %u - insert current uid into filename 添加当前uid %g - insert current gid into filename 添加当前gid %s - insert signal that caused the coredump into the filename 添加导致产生core的信号 %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间 %h - insert hostname where the coredump happened into filename 添加主机名 %e - insert coredumping executable name into filename 添加命令名
修改 core 文件大小
ulimit -c #详细信息 ulimit -a 如果结果是0,我们需要修改其大小 #当前有效的修改 ulimit -c [size] #这里size一般修改为unlimited,或者是其他数字:2048
在终端通过命令 ulimit -c unlimited 只是临时修改,重启后无效 ,要想永久修改有三种方式:
- 在/etc/rc.local 中增加一行 ulimit -c unlimited;
- 在/etc/profile 中增加一行 ulimit -c unlimited;
在/etc/security/limits.conf 最后增加如下两行记录:
@root soft core unlimited @root hard core unlimited
调试 core 文件编译时添加-g 参数,加上调试信息,可以查看行号。
启动 gdb 调试 core 文件:
gdb [exec file] [core file]
gdb 命令
bt 查看堆栈 info threads 查看所有线程正在运行的指令信息 thread apply all bt 打开所有线程的堆栈信息 threadapply threadID bt 查看指定线程堆栈信息