为什么GDB有时候会跳过本来应该执行的语句?怎么解决这个问题啊?

为什么GDB有时候会跳过本来应该执行的语句?怎么解决这个问题啊?,第1张

这个该执行的都执行了,有些地方你估计没弄明白。

schedule () at schedule.c:31

31 int i = (last_task_nr == 0) ? last_task_nr = 1 : last_task_nr

->这个就执行了你打印的那一句。

38 if (task[i] == NULL)

->这个就执行了你打印的另外一句。

因为没有全部程序,不清楚 task、last_task_nr 究竟怎么回事。

修改:

i的问题:

volatile int i = xxxxxxxx

如果还有问题:你可以:

例如 volatile int * volatile task

出问题的都加上。

不懂的自己看书吧,基本的东西,我就不讲课了陪散。

其他:

int i = (last_task_nr == 0) ? last_task_nr = 1 : last_task_nr//这里就没有执行

i++

->下面这个更好理解,也更快(不考虑更多优化),考虑优化就芦庆氏变成了下面的)

int i

if (!last_task_nr) {

last_task_nr=1

}

i=last_task_nr+1

-------------------------------------------------

++i 很可能和差枣last_task_nr+1有固定的的等于或者不等于的关系,所以根本就不需要i,但是程序不完整不能确定。

最近项目需要用到gdb调试程序, 鉴于铅纤每次用时都要google回忆下常瞎迟用的命令,效率有点low,故整理份命令备忘录,如下:

GDB Layout命令

每次gdb时不知道程序跑到哪了,只能list?? 错, layout窗口才是王道!!

GDB 跳转执行命令

注: call func() 与 print func() 的区别,在于调用void函数时, call func()没有返磨激李回值, 而print有~~

GDB调试输出命令

注:

p/x 3*i -- x for hexadecimal, o for octal, d for decimal, f for float, c for char, s for string

断点

观察点

当待观察点被读 或 被写时,程序停下来,并输出相关信息

Display跟踪点

用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 copying" 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 copying" 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12497880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存