【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/83748757

一、概述

在Valgrind下运行的程序不是由CPU直接执行的。相反,它运行在Valgrind提供的合成CPU上。这就是调试器在Valgrind上运行时无法调试程序的原因。

二、快速入门

在使用Memcheck工具时使用GDB调试程序,启动方式如下:
1、valgrind --vgdb = yes --vgdb-error = 0 可执程序
2、在另一个shell中,启动GDB:gdb 可执程序
3、将以下命令提供给GDB:(gdb) target remote | vgdb
现在可以调试程序了,例如插入断点然后使用GDB continue 命令。

三、远程调试gdbserver

1、gdbserver的原理

本地调试:GNU GDB调试器通常用于调试在同一台机器上运行的进程。在此模式下,GDB使用系统调用来控制和查询正在调试的程序。

远程调试:GDB还可以调试在不同计算机上运行的进程。为此,GDB定义了一个协议(即一组查询和回复数据包),它有助于获取内存或寄存器的值,设置断点等.gdbserver是这种“GDB远程调试”协议的实现。要调试在远程计算机上运行的进程,必须在远程计算机端运行gdbserver

2、Valgrind中的gdbserver

Valgrind核心提供了一个内置的gdbserver实现,它使用–vgdb=yes 或–vgdb=full来激活。此gdbserver允许在Valgrind的合成CPU上运行的进程远程调试。GDB将协议查询数据包(例如“获取寄存器内容”)发送到Valgrind中的gdbserver。gdbserver执行查询(例如,它将获取合成CPU的寄存器值)并将结果返回给GDB。

GDB可以使用各种通道(TCP / IP,串行线等)与gdbserver进行通信。在Valgrind中gdbserver的情况下,通过管道和一个名为vgdb的小帮助程序来完成通信,该程序充当中介。如果没有使用GDB,则vgdb也可用于从shell命令行向Valgrind gdbserver发送监视命令。

3、远程调试步骤

3.1 在目标机上启动gdbserver:
valgrind --tool = memcheck --vgdb = yes --vgdb-error = 0 ./prog
参数解释:
–vgdb=yes:启动gdbserver;
–vgdb-error = 0:在出现0个错误就开始调试,一般用在插入断点调试中

3.2 在调试机上启动GDB及vgdb
(vgdb是GDB和valgrind中gdbserver的通信的中间人)

gdb prog
(gdb) target remote | vgdb

如果远程只有一个gdbserver打印信息如下

Remote debugging using | vgdb
relaying data between gdb and process 2418
Reading symbols from /lib/ld-linux.so.2...done.
Reading symbols from /usr/lib/debug/lib/ld-2.11.2.so.debug...done.
Loaded symbols for /lib/ld-linux.so.2
[Switching to Thread 2418]
0x001f2850 in _start () from /lib/ld-linux.so.2
(gdb) 

如果有多个gdbserver,需要只当进程号PID
target remote | vgdb --pid=PID

(gdb) target remote | vgdb
Remote debugging using | vgdb
no --pid= arg given and multiple valgrind pids found:
use --pid=2479 for valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prog 
use --pid=2481 for valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prog 
use --pid=2483 for valgrind --vgdb=yes --vgdb-error=0 ./another_prog 
Remote communication error: Resource temporarily unavailable.

(gdb)  target remote | vgdb --pid=2479
Remote debugging using | vgdb --pid=2479
relaying data between gdb and process 2479
Reading symbols from /lib/ld-linux.so.2...done.
Reading symbols from /usr/lib/debug/lib/ld-2.11.2.so.debug...done.
Loaded symbols for /lib/ld-linux.so.2
[Switching to Thread 2479]
0x001f2850 in _start () from /lib/ld-linux.so.2
(gdb) 

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/83748757
今日推荐