当前位置:首页 » 操作系统 » gdb无源码调试

gdb无源码调试

发布时间: 2023-07-07 13:31:02

㈠ gdb调试命令是什么

gdb调试命令如下:

1、启动gdb

$gdb

这样可以和gdb进行交互了。

2、启动gdb,并且分屏显示源代码

$gdb -tui

这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p。

3、启动gdb调试指定程序app

$gdb app

这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。

4、启动程序之后,再用gdb调试

$gdb <program> <PID>

这里,<program>是程序的可执行文件名,<PID>是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

5、启动程序之后,再启动gdb调试

$gdb <PID>

这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,<PID>是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。

㈡ GDB调试无法加载源码

你使用Makefile编译调试的吧。
注意Makefile的写法,一个空格也会造成错误的。
在编译的代码中添加 -g 和 -Wall 。-g是为了GDB调试用的,-Wall可以显示全部的警告,对你分析程序很有好处。

这个Segemental fault 是段错误,造成这个错误的原因有很多,可能是内存 或者 栈溢出,出现这个错误需要功过GDB反复调试,查看错误原因。

㈢ 如何使用gdb调试android程序

用gdb调试动态链接库
大家都知道在 linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数。
我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。
首先,假设我们准备这样的一个动态链接库:
引用:
库名称是: ggg
动态链接库文件名是: libggg.so
头文件是: get.h
提供这样两个函数调用接口:
int get ();
int set (int a);

要生成这样一个动态链接库,我们首先编写这样一个头文件:
/************关于本文档********************************************
*filename: get.h
*********************************************************************/
int get ();
int set (int a);
然后准备这样一个生成动态链接库的源文件:
/************关于本文档********************************************
*filename: get.cpp
*********************************************************************/
#include
#include "get.h"
static int x=0;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n", a);
x = a;
return x;
}
然后我们用 GNU 的 C/C++ 编译器来生成动态链接库,编译命令如下:
引用:
g++ get.cpp -shared -g -DDEBUG -o libggg.so
这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,源代码如下:
/************关于本文档********************************************
*filename: pk.cpp
*********************************************************************/
#include
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
return 0;
}
编译此程序用下列命令,如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,就用下面这条命令:
引用:
g++ pk.cpp -o app -Wall -g -lggg
否则就用下面这条命令:
引用:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`
下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,调试就顺利完成,如下:
引用:
#gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main /* 这是在程序的 main 处设置断点 */
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set /* 这是在程序的 set 处设置断点 */
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y /* 这里必须选择 y 调试程序才会跟踪到动态链接库内部去 */
Breakpoint 2 (set) pending.
(gdb) run /* 开始运行我们的程序,直到遇见断点时暂停 */
Starting program: /data/example/c/app
Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.
Pending breakpoint "set" resolved
Breakpoint 1, main (argc=1, argv=0xbfArrayArray0504) at pk.cpp:7
7 int a = 100;
(gdb) n /* 继续执行程序的下一行代码 */
8 int b = get ();
(gdb) n /* 程序执行到了我们断点所在的动态链接库了 */
get x=0
Array int c = set (a);
(gdb) n
Breakpoint 3, set (a=100) at get.cpp:11
11 printf ("set a=%d\n", a);
(gdb) list /* 查看当前代码行周围的代码,证明我们已经跟踪到动态链接库的源代码里面了 */
6 printf ("get x=%d\n", x);
7 return x;
8 }
Array int set (int a)
10 {
11 printf ("set a=%d\n", a);
12 x = a;
13 return x;
14 }
(gdb) n
set a=100
12 x = a;
(gdb) n
13 return x;
(gdb) n
14 }
(gdb) n
main (argc=1, argv=0xbfArrayArray0504) at pk.cpp:10
10 int d = get ();
(gdb) n
get x=100
11 printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100,d=100
12 return 0;
(gdb) c
Continuing.
Program exited normally.
(gdb) quit /* 程序顺利执行结束 */
如果我们没有把动态链接库放到指定目录,比如/lib里面,调试就会失败,过程如下:
引用:
# gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (set) pending.
(gdb) run /* 虽然调试操作都一样,但程序执行失败 */
Starting program: /data/example/c/app
/data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory
Program exited with code 0177.
(gdb) quit

㈣ gdb调试问题

提示什么, 如果是同一个文件,一个能调试,另一个不能调试,最大的原因是权限问题, 这个你用GDB载入的时候,按R 运行后,一般会有提示的。 另外也可能文件损坏了。。你最好再 编译一下,如果是直接 attach进行的调试,则极有可能是权限问题。

㈤ 使用GNU/gdb调试Linux C/C++可执行程序查看出错源代码、设置断点

gdb是GNU开源组织发布的一个强大的Linux程序调试工具,比图形化的调试工具更强大,主要来调试C/C++语言程序。

Debug 版本的可执行程序包含调试信息,用于程序员调试程序。

Release 版本的可执行程序往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以方便用户使用。

用gcc/g++编译时,要加上-g选项生成debug版本的可执行程序,否则就无法使用gdb调试了。

r 表示开始run, 如果在运行的过程中发生了错误,比如segmentation fault,可以查看此时的出错源代码:

通过b或者break设置断点,断点的设置可以通过函数名、行号、文件名+函数名、文件名+行号以及偏移量、地址等进行设置。

比如在function Peer_auto_save上设置断点,在peer.c的第136行设置断点:

从断点处继续运行

退出gdb

㈥ gdb加载动态库成功,但是不能显示动态库中的源码(gdb+gdbserver)

因为具体的给的不够详细,不清楚你遇到的情况。
如果仅从断点上看,应该就是CApartment.cpp:55
但是,如果你的程序编译的时候,不是-O0,那个可能回不到源码,只能看汇编。
1、有时候(很少)就是编译器的错误。
2、还有可能就是你调试的程序和你的源码不匹配
3、你的程序已经崩溃了,破坏了堆栈或者GDB需要的数据。
4、这个地方有特殊的定位信息
5、其他情况,还是比较多的,经常遇到。
如果懂汇编,最好看看汇编。
如果不懂,看看那一条语句是最后一条能够跟踪的语句。
仔细看看最后一条语句的所有变量,应该能猜出来是什么问题。

热点内容
缝合算法 发布:2025-03-18 03:46:06 浏览:362
java遍历二维数组 发布:2025-03-18 03:36:01 浏览:410
锐捷源码 发布:2025-03-18 03:26:55 浏览:436
诉讼中止裁定后可否解压 发布:2025-03-18 03:24:51 浏览:128
sqlserver全文搜索 发布:2025-03-18 03:23:58 浏览:715
u盘里面文件夹没有了 发布:2025-03-18 03:22:19 浏览:229
华为p系列手机哪个配置好 发布:2025-03-18 03:20:13 浏览:621
易语言连接access数据库 发布:2025-03-18 03:12:48 浏览:661
苗木源码 发布:2025-03-18 03:12:38 浏览:747
oracle卸载数据库 发布:2025-03-18 03:05:15 浏览:46