From 1bfa276521d9f80a0c2804a3f5cae2d28dcd0267 Mon Sep 17 00:00:00 2001 From: "Xu, Shunxuan" Date: Fri, 24 Aug 2018 15:52:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=96=E8=AF=91debug?= =?UTF-8?q?=E7=89=88glibc=E5=8F=8A=E7=AE=80=E5=8D=95=E7=9A=84gdb=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改: README.md 新文件: glibc-debug-gdb.md Signed-off-by: Xu, Shunxuan --- README.md | 2 + glibc-debug-gdb.md | 231 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 glibc-debug-gdb.md diff --git a/README.md b/README.md index 2d0ed7f..17c60dd 100755 --- a/README.md +++ b/README.md @@ -46,3 +46,5 @@ ## [研发一部服务器信息](linx1_server_info.md) ## [firefox编译过程记录](firefox.md) + +## [编译调试版glibc以及gdb调试的简单用法](glibc-debug-gdb.md) diff --git a/glibc-debug-gdb.md b/glibc-debug-gdb.md new file mode 100644 index 0000000..6ad0d81 --- /dev/null +++ b/glibc-debug-gdb.md @@ -0,0 +1,231 @@ +# 编译调试版glibc以及gdb调试的简单用法 # + +## 一、概述 ## + +1、编译调试版glibc + +2、如何使用gdb调试代码 + +## 二、编译glibc ## + +1、下载源码: + +``` +git clone git@gitlab.rd.in.linx:linx6.0.42/applications.git + +cd application/packages/g/glibc +``` + +2、在glibc configure编译时添加--enable-debug选项 + +``` +vi Pkgfile + +#修改版本与glibc区分 + +LINX_VERSION=linx-debugns + +#在configure中添加如下内容: + +--enable-debug=yes CFLAGS="-O1 -g" CPPFLAGS="-O1 -g" +``` + +3、编译 + +需要特别注意:需添加-ns参数,no strip(保留调试信息) + +``` +pkgmk -kw -s -pa post_add.sh -pm post_mk.sh -ns +``` + +4、安装 + +``` +pkgadd glibc#2.5-x86_64-linx-debugns-Rocky4.2.pkg.tar.gz -u +``` + +## 三、使用gdb调试 ## + +### 1、首先编译一个二进制文件 ### + +g++ -lpthread pthread_test.cpp -g -o pthread_test + +参数说明: + +``` +-lpthread: 编译时添加链接库 + +pthread_test.cpp : 需要编译的C++程序 + +-g: 开启debug调试选项 + +-o: 制定目标名称,缺省时编译出的文件是a.out + +pthread_test : 编译后的二进制文件名 +``` + +检测二进制文件是否支持debug调试 + +``` +readelf -S ./pthread_test |grep debug +``` + +如需要关闭二进制文件中的debug,如下命令: + +``` +strip -S pthread_test +``` + +### 2、gdb简单调试示例 ### + +在使用gdb调试时,需要glibc/work/src源码目录,否则调试时会报错,找不到文件。 + +``` +localhost:~ # gdb -q pthread_jjli +Reading symbols from /root/pthread_jjli...done. +(gdb) b main #在main()函数设置断点 +Breakpoint 1 at 0x4007e4: file pthread_jjli.cpp, line 21. +(gdb) r #运行程序 +Starting program: /root/pthread_jjli + +Breakpoint 1, main () at pthread_jjli.cpp:21 +21 float useTime = 0; +(gdb) s #执行下一条代码 +22 unsigned int loop = 0; +(gdb) + 24 printf("Thread creation use hello\n"); +(gdb) + Thread creation use hello + 27 loop ++; +(gdb) + 28 gettimeofday(&tv_begin, NULL); +(gdb) + 29 res = pthread_create(&a_thread, NULL, thread_function, NULL); +(gdb) + 30 gettimeofday(&tv_end, NULL); +(gdb) + 31 for (int i=0;i<100;i++){ +(gdb) + 32 *(p+i) = 1; +(gdb) + + Program received signal SIGSEGV, Segmentation fault. + 0x000000000040084a in main () at pthread_jjli.cpp:32 +32 *(p+i) = 1; +(gdb) where #显示代码出错位置 +#0 0x000000000040084a in main () at pthread_jjli.cpp:32 +(gdb) bt #跟踪错误 +#0 0x000000000040084a in main () at pthread_jjli.cpp:32 +(gdb) l #显示代码 + 27 loop ++; + 28 gettimeofday(&tv_begin, NULL); + 29 res = pthread_create(&a_thread, NULL, thread_function, NULL); + 30 gettimeofday(&tv_end, NULL); + 31 for (int i=0;i<100;i++){ + 32 *(p+i) = 1; + 33 } + 34 + 35 if (res != 0) + 36 { +(gdb) +``` + +### 3、gdb使用 ### + +(1)简介: + +GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 + +需要特别注意的是,在使用gdb调试时,必须保证其源码在当前目录,例如在调试glibc时,需要glibc/work/src源码目录,否则调试时会报错。 + +(2)gdb命令说明: + +``` +常用命令: +r: 程序开始运行 +b: 设置断点 +c: 程序继续运行 +q: 退出程序 +d: 删除断点 +s: 执行下一条代码,如果函数进入函数 +n: 一条一条执行 +where: 显示代码出错位置 +bt: 跟踪错误 +l: 默认显示10行代码 +p: 打印变量的值 +回车: 执行上一条gdb命令 + +扩展命令: + +delete break: 删除所有断点 +delete break n: 删除某个断点,n为断点号 +clear n: 删除设置在n行的断点 +disable break n: 禁用某个断点,n为断点号 +enable break n: 使能莫个断点,n为断点号 +info b: 查看所有断点信息 +info b n: 查看第n个断点的信息 +list: 默认显示10行代码 +finish: 运行到当前函数返回 +l_行号或函数名: 列出源码 +``` + +(3)运行gdb的几种方式: + +gdb pthread_test: 进入gdb模式并加载文件 + +``` +localhost:~ # gdb pthread_test +GNU gdb (GDB) 7.6.2 +Copyright (C) 2013 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. Type "show copying" +and "show warranty" for details. +This GDB was configured as "x86_64-unknown-linux-gnu". +For bug reporting instructions, please see: +... +Reading symbols from /root/pthread_test...done. +(gdb) +``` + +dgb -q pthread_test: 不输出gdb的版本信息说明 + +``` +localhost:~ # gdb -q pthread_test +Reading symbols from /root/pthread_test...done. +(gdb) +``` + +gdb -q :进入gdb模式,然后再加载文件 + +``` +localhost:~ # gdb -q +(gdb) file pthread_test +Reading symbols from /root/pthread_test...done. +(gdb) +``` + +(4)如果关闭debug调试,如下所示: + +``` +localhost:~ # gdb -q +(gdb) file pthread_jjli +Reading symbols from /root/pthread_jjli...(no debugging symbols found)...done. +(gdb) b main +Breakpoint 1 at 0x4007e0 +(gdb) r +Starting program: /root/pthread_jjli +(no debugging symbols found) + (no debugging symbols found) + (no debugging symbols found) + (no debugging symbols found) + (no debugging symbols found) + (no debugging symbols found) + (no debugging symbols found) + + Breakpoint 1, 0x00000000004007e0 in main () + (gdb) +``` + + +