免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 14822 | 回复: 32
打印 上一主题 下一主题

[实践] gdb可以实现源码级调试so文件吗?[己解决] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-07 09:55 |只看该作者 |倒序浏览
本帖最后由 testh 于 2013-01-08 15:06 编辑

查了一些文章,有的说不能设置断点。
有熟悉的兄弟吗?

论坛徽章:
0
2 [报告]
发表于 2013-01-07 10:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2013-01-07 11:29 |只看该作者
肯定是可以的了,不过远程gdb比较麻烦,kdb 可以本机中断。不过应该都可以通过printk解决的最方便吧。

论坛徽章:
0
4 [报告]
发表于 2013-01-07 12:30 |只看该作者
你说的源码级是内核源码级吗?如果是内核源码得用kgdb来跟踪。我倒是最近利用了gdb来跟踪alsa-1.0.25Lib及utils,只需要在编译时加上CFLAGS=-g,这样生成的libasound.so可以跟踪,效果蛮好的。

论坛徽章:
0
5 [报告]
发表于 2013-01-07 13:50 |只看该作者
本帖最后由 testh 于 2013-01-07 13:51 编辑

感谢楼上各位的回复。
是在本地调试,本来是移植到arm上的,但是想先弄清楚alsa-lib的流程,所以在哪里调试都是一样的了。

论坛徽章:
0
6 [报告]
发表于 2013-01-07 13:54 |只看该作者
回复 4# frogsu


    兄弟,可以描述的详细一些吗?
以前也用gdb来调试应用程序,但是这次调试时总是失败,提示找不到so,你可以把调试步骤描述一下吗?
例外,你在调试的时候可以在alsa-lib的源码里面设置断点吗?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
7 [报告]
发表于 2013-01-07 13:55 |只看该作者
完全可以


论坛徽章:
0
8 [报告]
发表于 2013-01-07 14:12 |只看该作者
回复 7# T-Bagwell


    谢谢回复。
使用gdb来调试so动态库还不熟悉,可否给些操作步骤的提示

论坛徽章:
0
9 [报告]
发表于 2013-01-07 14:16 |只看该作者
对于alda-lib的源码目录是否需要指定路径?

论坛徽章:
0
10 [报告]
发表于 2013-01-07 16:16 |只看该作者
本帖最后由 testh 于 2013-01-07 16:23 编辑

我把alsa-lib-1.0.24放在/usr/local/usr/my_tools/alsa-lib-1.0.24.1下。
然后进入到alsa-lib-1.0.24.1/test/.libs/下面执行gdb ./pcm_min 。用gdb来调试pcm_min这个小的测试程序。
进入gdb后。如下:
  1. zz@ubuntu:/usr/local/usr/my_tools/alsa-lib-1.0.24.1/test/.libs$ gdb ./pcm_min
  2. GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
  3. Copyright (C) 2010 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  5. This is free software: you are free to change and redistribute it.
  6. There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
  7. and "show warranty" for details.
  8. This GDB was configured as "i686-linux-gnu".
  9. For bug reporting instructions, please see:
  10. <http://www.gnu.org/software/gdb/bugs/>...
  11. Reading symbols from /usr/local/usr/my_tools/alsa-lib-1.0.24.1/test/.libs/pcm_min...done.
  12. (gdb) b
  13. No default breakpoint address now.
  14. (gdb) info b
  15. No breakpoints or watchpoints.
  16. (gdb) b main
  17. Breakpoint 1 at 0x804865e: file pcm_min.c, line 26.
  18. (gdb) l
  19. 17          int j;
  20. 18          unsigned int i;
  21. 19          snd_pcm_t *handle;
  22. 20          snd_pcm_sframes_t frames;
  23. 21  
  24. 22          for (i = 0; i < sizeof(buffer); i++)
  25. 23          {
  26. 24            if(i<=1024)
  27. 25                  buffer[i] = random() & 0xff;
  28. 26            else
  29. (gdb) b
  30. No default breakpoint address now.
  31. (gdb) l
  32. 27                buffer[i]=buffer[i-1024];
  33. 28          }
  34. 29  
  35. 30    if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
  36. 31      printf("Playback open error: %s\n", snd_strerror(err));
  37. 32      exit(EXIT_FAILURE);
  38. 33    }
  39. 34    if ((err = snd_pcm_set_params(handle,
  40. 35                                  SND_PCM_FORMAT_S16,
  41. 36                                  SND_PCM_ACCESS_RW_INTERLEAVED,
  42. (gdb) b snd_pcm_open
  43. Breakpoint 2 at 0x8048518
  44. (gdb) b snd_pcm_set_params
  45. Breakpoint 3 at 0x8048538
  46. (gdb) info b
  47. Num     Type           Disp Enb Address    What
  48. 1       breakpoint     keep y   0x0804865e in main at pcm_min.c:26
  49. 2       breakpoint     keep y   0x08048518 <snd_pcm_open@plt>
  50. 3       breakpoint     keep y   0x08048538 <snd_pcm_set_params@plt>
  51. (gdb) dir /usr/local/usr/my_tools/alsa-lib-1.0.24.1/src/
  52. Source directories searched: /usr/local/usr/my_tools/alsa-lib-1.0.24.1/src:$cdir:$cwd
  53. (gdb) show directories
  54. Source directories searched: /usr/local/usr/my_tools/alsa-lib-1.0.24.1/src:$cdir:$cwd
  55. (gdb) r
  56. Starting program: /usr/local/usr/my_tools/alsa-lib-1.0.24.1/test/.libs/pcm_min
  57. [Thread debugging using libthread_db enabled]

  58. Breakpoint 1, main () at pcm_min.c:26
  59. 26            else
  60. (gdb) l
  61. 21  
  62. 22          for (i = 0; i < sizeof(buffer); i++)
  63. 23          {
  64. 24            if(i<=1024)
  65. 25                  buffer[i] = random() & 0xff;
  66. 26            else
  67. 27                buffer[i]=buffer[i-1024];
  68. 28          }
  69. 29  
  70. 30    if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
  71. (gdb) l 10
  72. 5 #include "../include/asoundlib.h"
  73. 6 #include "sin_stereo_1s.h"
  74. 7
  75. 8 static char *device = "default";      /* playback device */
  76. 9
  77. 10  snd_output_t *output = NULL;
  78. 11  unsigned char buffer[16*1024];        /* some random data */
  79. 12  extern unsigned char data[];
  80. 13  
  81. 14  int main(void)
  82. (gdb)
  83. 15  {
  84. 16          int err;
  85. 17          int j;
  86. 18          unsigned int i;
  87. 19          snd_pcm_t *handle;
  88. 20          snd_pcm_sframes_t frames;
  89. 21  
  90. 22          for (i = 0; i < sizeof(buffer); i++)
  91. 23          {
  92. 24            if(i<=1024)
  93. (gdb)
  94. 25                  buffer[i] = random() & 0xff;
  95. 26            else
  96. 27                buffer[i]=buffer[i-1024];
  97. 28          }
  98. 29  
  99. 30    if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
  100. 31      printf("Playback open error: %s\n", snd_strerror(err));
  101. 32      exit(EXIT_FAILURE);
  102. 33    }
  103. 34    if ((err = snd_pcm_set_params(handle,
  104. (gdb) info b
  105. Num     Type           Disp Enb Address    What
  106. 1       breakpoint     keep y   0x0804865e in main at pcm_min.c:26
  107.   breakpoint already hit 1 time
  108.   2       breakpoint     keep y   0x00179c72 <snd_pcm_open+4>
  109.   3       breakpoint     keep y   0x00181c90 <snd_pcm_set_params+5>
  110.   (gdb) c
  111.   Continuing.
  112.   $$...init buffer.....
  113.   #####################snd_pcm_open...

  114.   Breakpoint 2, 0x00179c72 in snd_pcm_open () from /usr/lib/libasound.so.2
  115.   (gdb) s
  116.   Single stepping until exit from function snd_pcm_open,
  117.   which has no line number information.
  118.   zz[snd_dlsym_verify:121],vname=[_snd_config_hook_load_dlsym_config_hook_001]
  119.   zz[snd_dlsym_verify:123]
  120.   zz[snd_dlsym_verify:121],vname=[__snd_pcm_hw_open_dlsym_pcm_001]
  121.   zz[snd_dlsym_verify:123]
  122.   main () at pcm_min.c:37
  123.   37                                  1,
  124.   (gdb)

复制代码
我想进入line47-line50处的的snd_pcm_xxx函数中,所以把相应的行号加入了break,但是当执行到时,在line116时已经进入了 snd_pcm_open 处的断点,但是输入s(step)却没能进入它的源码中,而是直接执行完了再退出来了。
请教给如何进入snd_pcm_open()函数的源码呢,这个函数就是在需要调试的libasound.so库中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP