使用gdb调试无法在函数名设置断点,请教大家。

NowDoIT 2013-08-19 05:16:26
在使用gdb调试的时候,在函数名设置断点:
b test_fun
提示没有这个函数,但是查看源代码是存在的。

举个有代码的例子:
int a(){
do something;
if ( b() == -1 ){
return -1;
}
}

调试的时候,能够在函数 a() 处加断点;单步执行到 第三行 的时候,会直接跳入函数 b() 的内部去执行;
按照常理,应该是显示 b() , 然后b的参数信息等等;但是奇怪的是会直接跳入函数b()内部。

请问有人遇到过这种情况吗?什么原因导致的?
谢谢大家!
...全文
2118 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowDoIT 2013-08-22
  • 打赏
  • 举报
回复
引用 13 楼 ForestDB 的回复:
e有被人调用过么?
引用 14 楼 mujiok2003 的回复:
试试 b your_source.cpp:your_line_num
引用 15 楼 mujiok2003 的回复:
[quote=引用 楼主 NowDoIT 的回复:] 会直接跳入函数 b() 的内部去执行; 按照常理,应该是显示 b() , 然后b的参数信息等等;但是奇怪的是会直接跳入函数b()内部。
应该是被inline了[/quote]
引用 16 楼 zhao4zhong1 的回复:
将e改为my_e再试试? 可能e这个名字被系统其它默认库占用了也说不定。
谢谢楼上几位,问题找到了。默认的gcc的flag有这么一行, -c -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -gstabs 当我把 -O 去掉或者后面加上 -fno-inline 标志的时候,发现函数e在生成的.o文件中有符号了。 这样看来,应该是程序在 -O 的同时将 函数 e() 默认编译成了内联函数。 再次感谢大家的热心帮助,结贴散分了!
赵4老师 2013-08-21
  • 打赏
  • 举报
回复
将e改为my_e再试试? 可能e这个名字被系统其它默认库占用了也说不定。
mujiok2003 2013-08-21
  • 打赏
  • 举报
回复
引用 楼主 NowDoIT 的回复:
会直接跳入函数 b() 的内部去执行; 按照常理,应该是显示 b() , 然后b的参数信息等等;但是奇怪的是会直接跳入函数b()内部。
应该是被inline了
mujiok2003 2013-08-21
  • 打赏
  • 举报
回复
试试 b your_source.cpp:your_line_num
ForestDB 2013-08-21
  • 打赏
  • 举报
回复
e有被人调用过么?
NowDoIT 2013-08-21
  • 打赏
  • 举报
回复
引用 9 楼 ForestDB 的回复:
[quote=引用 楼主 NowDoIT 的回复:] 在使用gdb调试的时候,在函数名设置断点: b test_fun 提示没有这个函数,但是查看源代码是存在的。 举个有代码的例子:
int a(){
  do something;
  if ( b() == -1 ){
     return -1;
  }
}
调试的时候,能够在函数 a() 处加断点;单步执行到 第三行 的时候,会直接跳入函数 b() 的内部去执行; 按照常理,应该是显示 b() , 然后b的参数信息等等;但是奇怪的是会直接跳入函数b()内部。 请问有人遇到过这种情况吗?什么原因导致的? 谢谢大家!
后面的例子和前面的问题有什么关系?
引用 8 楼 NowDoIT 的回复:
找到问题所在了,在编译生成的动态库里面找不到这个函数名:
nm test.o | grep myfun 
但是奇怪的是为什么会编译不进去呢???! 有人遇到过这种情况吗?
myfun凭什么要编译进去,有什么证据?[/quote] 在.c文件中做了函数声明,接着实现了函数。类似的,
#include <stdio.h>
static int a(int a, int b);
static int b(int a, int b);
static int c(int a, int b);
static int d(int a, int b);
static int e(int a, int b);

static int a(int a,int b)
{
  //something
}

static int b(int a,int b)
{
  //something
}

static int c(int a,int b)
{
  //something
}

static int d(int a,int b)
{
  //something
}

static int e(int a,int b)
{
  //something
}
我不明白的是编译生成的.o文件中能够找到函数 a,b,c,d的 符号,却找不到 e 的符号。
NowDoIT 2013-08-21
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
如果是我遇到帖主的问题,就不去费劲让调试器正确加载符号或正确使用已加载的符号,而是将主要精力放在各种符号对应的十六进制地址和其中的十六进制值上去解决问题即可。
能再详细讲讲吗,赵老师~ 不是很明白你说的意思,谢谢。
赵4老师 2013-08-20
  • 打赏
  • 举报
回复
如果是我遇到帖主的问题,就不去费劲让调试器正确加载符号或正确使用已加载的符号,而是将主要精力放在各种符号对应的十六进制地址和其中的十六进制值上去解决问题即可。
ForestDB 2013-08-20
  • 打赏
  • 举报
回复
引用 楼主 NowDoIT 的回复:
在使用gdb调试的时候,在函数名设置断点: b test_fun 提示没有这个函数,但是查看源代码是存在的。 举个有代码的例子:
int a(){
  do something;
  if ( b() == -1 ){
     return -1;
  }
}
调试的时候,能够在函数 a() 处加断点;单步执行到 第三行 的时候,会直接跳入函数 b() 的内部去执行; 按照常理,应该是显示 b() , 然后b的参数信息等等;但是奇怪的是会直接跳入函数b()内部。 请问有人遇到过这种情况吗?什么原因导致的? 谢谢大家!
后面的例子和前面的问题有什么关系?
引用 8 楼 NowDoIT 的回复:
找到问题所在了,在编译生成的动态库里面找不到这个函数名:
nm test.o | grep myfun 
但是奇怪的是为什么会编译不进去呢???! 有人遇到过这种情况吗?
myfun凭什么要编译进去,有什么证据?
NowDoIT 2013-08-20
  • 打赏
  • 举报
回复
找到问题所在了,在编译生成的动态库里面找不到这个函数名:
nm test.o | grep myfun 
但是奇怪的是为什么会编译不进去呢???! 有人遇到过这种情况吗?
氰客 2013-08-20
  • 打赏
  • 举报
回复
clean all -> rebuild
NowDoIT 2013-08-20
  • 打赏
  • 举报
回复
引用 3 楼 qq120848369 的回复:
directory 源代码路径
试过了 没用。
NowDoIT 2013-08-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
加-g参数编译?
加了,因为函数a()都能调试进去呀。
AnYidan 2013-08-19
  • 打赏
  • 举报
回复
Linux C 编程一站式学习
qq120848369 2013-08-19
  • 打赏
  • 举报
回复
directory 源代码路径
max_min_ 2013-08-19
  • 打赏
  • 举报
回复


1 首先 确定编译的时候是否加了 -g 选项

2 进入gdb调试,info break  查看是否有函数断点信息

3 a()断点成功, 试试 next 单步执行语句跟踪查找确认信息是否满足条件进去b函数入口
赵4老师 2013-08-19
  • 打赏
  • 举报
回复
加-g参数编译?

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧