GDB【5】-嵌入式平台xxx-linux-gdb远程调试动态库

2023-11-09

1.下位机准备工作

下位机调试启动脚本

   #!/bin/bash 
   
   version='01.00.0005'
   NAND_PATH='/nandflash'
   LIB_PATH=$NAND_PATH/lib
   BIN_PATH=$NAND_PATH/bin
   CFG_PATH=$NAND_PATH/config
   DB_PATH=$NAND_PATH/database
   LOG_PATH=$NAND_PATH/log
   SH_PATH=$NAND_PATH/script
   WEB_PATH=$NAND_PATH/webserver/thttpd
   SRC_PATH=$NAND_PATH/src
   TMP_DB_PATH=/tmp/db
  
  
   tftp -g -r libxxx_prtl_k3.so 192.168.20.156
   rm -f /usr/lib/libxxx_prtl_k3.so
   ln -s $LIB_PATH/libxxx_prtl_k3.so /usr/lib/libxxx_prtl_k3.so
   gdbserver 192.168.20.156:7000 $BIN_PATH/xxx_udp -p 50001

line4:硬件平台上存放动态库的绝对路径/nandflash/lib
line16:利用tftp将需要的调试的动态库下载进入/nandflash/lib中
line18:下位机建立软连接到系统动态中,以便程序运行时能找到动态库
line19:启动gdbsever远程调试

root@lig-ppc:/nandflash/lib# sh 34FDstartdebug.sh 
Process /nandflash/bin/lig_udp created; pid = 5602
Listening on port 7000

2 回到 PC 端,远程连接下位机gdbserver

1.启动gdb

(develp)>>> powerpc-linux-gdb 
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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 "--host=i686-eldk-linux --target=powerpc-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) target remote 192.168.20.208:7000
Remote debugging using 192.168.20.208:7000
warning: Could not load vsyscall page because no executable was specified
try using the "file" command first.
0x0ffd7b50 in ?? ()
(gdb) file lig_udp
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from /home/sheldon/lig_pro/CPMS-34/APP/lig_udp/lig_udp...done.
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0xb7ef3bd8 in ?? ()

关键步骤:
1 因为动态库运行时才会被加载,所以一定要先运行将需要的动态库加载完毕
2.Ctrl+c 将正在运行的程序打断暂时挂起
3.info sharedlibrary 查看已经加载的动态库

(gdb) 
(gdb) info sharedlibrary
warning: Could not load shared library symbols for 10 libraries, e.g. linux-vdso32.so.1.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
From        To          Syms Read   Shared Object Library
                        No          linux-vdso32.so.1
                        No          /lib/preloadable_libiconv.so
                        No          /usr/lib/libsqlite3.so.0
                        No          /lib/libpthread.so.0
                        No          /lib/librt.so.1
                        No          /usr/lib/libxxx_prtl_k3.so
                        No          /usr/lib/libxxx_matrix.so
                        No          /lib/libc.so.6
                        No          /lib/libdl.so.2
                        No          /lib/ld.so.1
(gdb) set solib-search-path /tftpboot                               
Reading symbols from /tftpboot/libxxx_prtl_k3.so...done.
Loaded symbols for /tftpboot/libxxx_prtl_k3.so
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
  1. set solib-search-path设置动态库的搜索路径,该命令可设置多个搜索路径
    路径之间使用“:”隔开(在linux中为冒号,DOS和Win32中为分号)
    /tftpboot 我已经把自己生成的动态库拷贝到这个文件下面,方便tftp上传下载使用
    (可以根据自己喜好设置不同路径)
    5.再次查看加载的动态库,要调试的目标动态库已经有了地址,标识号已经全部读到
    7.设置断点
    8.继续运行
    8.发送数据
(gdb) info sharedlibrary
From        To          Syms Read   Shared Object Library
                        No          linux-vdso32.so.1
                        No          /lib/preloadable_libiconv.so
                        No          /usr/lib/libsqlite3.so.0
                        No          /lib/libpthread.so.0
                        No          /lib/librt.so.1
0x0fd960e0  0x0fdbc44c  Yes         /tftpboot/libxxx_prtl_k3.so
                        No          /usr/lib/libxxx_matrix.so
                        No          /lib/libc.so.6
                        No          /lib/libdl.so.2
                        No          /lib/ld.so.1
(gdb) b xxx_prtl_k3_set_cpedid
Breakpoint 1 at 0xfdb3b98: file /home/sheldon/xxx_pro/CPMS-34/APP/pk3000/src/xxx_k3_matrix_edid.c, line 123. 
(gdb) c
Continuing.

Breakpoint 1, xxx_prtl_k3_set_cpedid (handle=0x10030420) at /home/sheldon/xxx_pro/CPMS-34/APP/pk3000/src/xxx_k3_matrix_edid.c:123
123		char  dest_bitmap[32]={0};

网上还有用
set solib-absolute-prefix ,set sysroot,以及设置环境变量 LD_LIBRARY_PATH,但是我并没有成功
还请不吝赐教

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB【5】-嵌入式平台xxx-linux-gdb远程调试动态库 的相关文章

  • 如何在 gdb 中附加进程

    我有一个简单的 C 程序 它分叉一个进程 然后运行一个可执行文件 我想将子进程附加到 gdb 我在控制台中运行主程序并打开另一个控制台来查找子进程的 pid 然后使用以下命令启动 gdb gdb attach 12271 where 122
  • 将大核心文件转换为“minicore”文件

    如何将核心文件减少到仅线程堆栈 我希望能够运行 gdbthread apply all bt在迷你核心上 仅此而已 我正在处理大型 gt 4GB 多线程 Linux ELF 核心文件 这些文件太大而无法返回进行分析 我见过谷歌断点器 htt
  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • Google crashpad 上的一个交叉编译平台应用程序。 Ubuntu 中无法读取 dmp 文件

    我有一个小qt项目 https github com apalomer qt crashpad test我想跟踪一个分段错误 这是一个示例 分段错误是出于测试目的而手动添加的 在实际项目中我不知道留在那里的分段错误 我决定使用 google
  • 如何在 gdb 上进行 grep 打印

    有没有办法在 gdb 中 grep 打印命令的输出 就我而言 我正在使用 gdb 调试核心转储 并且我正在调试的对象包含大量元素 我发现很难寻找匹配的属性 即 gdb print this grep
  • 使用 gdb 调试时彻底退出 valgrind

    我正在使用 valgrind 和 gdb 调试程序 然而 我以一种野蛮的方式终止了这些调试会话 这真的是它应该做的吗 设置调试会话 按照来自的指示valgrind 官方网站 http valgrind org docs manual man
  • GDB 函数参数上的条件中断

    我想在函数参数大于某个值时设置断点 下面的虚拟代码 int main void uint64 t num 123456 uint64 t x 847534 uint64 t other num x x num other stuff her
  • GNU gdb 如何显示源文件名和符号行

    当使用 GNU gdb 调试 c 进程时 list 命令将打印行但不告诉我文件名 设置断点可以显示我想要的所有行和文件信息 但我不想设置断点并且必须禁用或删除它 gdb b oyss funtion Breakpoint 13 at 0x8
  • 专门逐行调试

    我有一个用 Pascal 编写的脚本 我会以这种方式调试它 在每一行停止 转储内存中所有变量的值 然后转到下一行 是否可以使用 gdb 或其他 Linux 开源工具来完成此操作 使用选项编译文件 g fpc gpc g file pas R
  • GDB错误:“进程记录:当前架构不支持记录功能”

    我正在尝试在 GDB 中进行反向执行 特别是target record按照说明在 gdb 中运行我的程序后here https stackoverflow com questions 1206872 go to previous line
  • 观察点固定地址

    对于我当前的嵌入式应用程序 我尝试将 GDB 观察点放在固定的内存地址处 例如 我的应用程序更新以下地址 0x10793ad0 为了确定代码的哪一部分破坏了值 我尝试了 watch 0x10793ad0 即使 GDB 在此之后不会打印任何错
  • TUI模式下的GDB:如何处理stderr与ui的交互

    我正在尝试使用gdb来调试caffe http caffe berkeleyvision org 我更喜欢使用 tui 模式 因为它允许我查看整个源代码而不仅仅是一行 但有一个问题 每当程序caffe输出一些东西stderr 输出扭曲了 t
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 评估 gdb 中的变量/函数

    我有以下代码 char seg mmap 0 printf seg x n seg 该程序打印seg b7ffd000 而在 gdb 中 对于相同的执行 当使用p x seg 它打印 2 0x0 我在这里很困惑 这不是同一个var吗seg
  • 多线程调试器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 GDB 在使用多线程 pthreads 进行调试时存在严重问题 nix 上还有其他好的 C C 多线程调
  • 漂亮的地图打印机会抛出类型错误

    我已经使用配置了漂亮的打印机http wiki eclipse org CDT User FAQ How can I inspect the contents of STL containers 3F http wiki eclipse o

随机推荐