我正在运行一个对文件进行处理的程序。
我希望能够为程序提供多个文件,通过使用gdb附加到程序,我希望在代码中的某个点为每个文件获得内存转储。我希望每个文件的转储都转到与输入文件具有相同文件名的文件(可能在格式化它之后,比如添加后缀)
因此,假设我有一个名为HereIsTheFileName(char*filename)的函数和另一个名为DumpThisMemoryRegion(void*startAddr,void*endAddr)的函数,我想执行如下操作:
要获取环境变量的文件名,请执行以下操
标签: Gdb
shared-librariesreversedecompilingdisassembly
我有一个可执行文件和剥离的lib。所以可执行文件使用的文件。
我已经反编译了lib.so文件并定义了函数fun我想设置断点及其内部地址
是否可以使用gdb在函数fun上设置断点?
如何在运行时定义fun的地址
是否可以使用gdb在函数fun上设置断点
是:GDB可以在任意地址上设置断点:
(gdb) break *0x12345678
如何在运行时定义fun的地址
由于GDB默认禁用ASLR,因此fun的地址不会因运行而改变(假设您从一开始就在GDB下运行程序)
因此,您只需找到fun的地址一
现在,我构建了google webrtc项目的peerconnection_客户端。
但是,当输入命令:gdb out/Default/peerconnection\u client时,我得到错误:
从中读取符号
/opt/dada/src/webrtc/native/src/out/Default/peerconnection_client…Dwarf
错误:具有DW_AT_GNU_dwo_名称的编译单元具有子级(偏移量
0x59d0)[在模块中
/opt/dada/src/webrtc/na
我正在尝试在gdb上运行我的应用程序。因此,我用“g”选项编译了它。但是当我运行gdb./app时,我得到:
DW_FORM_strp pointing outside of .debug_str section [in module /home/w/app]
我不能休息:
(gdb) break main
No symbol table is loaded. Use the "file" command.
(gdb) .
很可能您已经用较新版本的GCC编译了您的程序,但是正在用旧的G
我正在做一项调查
ps | grep process_name | awk '{if ($2 == "process_name") {print $1} }'
它显示进程名称的进程id
然后我做了一个gdb-p进程\u id。我想把这两条语句合并成一条语句。有什么建议吗
ps | grep process_name | awk '{if ($2 == "process_name") {print $1} }'
输出:进程id
gdb -p process_id
不需要grep或awk或
考虑:
(gdb) q
A debugging session is active.
Inferior 1 [process 9018] will be killed.
Quit anyway? (y or n) y
什么是.gdbinit选项使GDB总是在退出请求时终止正在运行的进程
我知道GDB可以连接到已经运行的进程,所以在退出时杀死它们是不好的。但对于一个从it开始的流程来说,第二次退出时,确认您的操作的需求开始让人烦恼
set confirm off
有关详细信
我在Linux进程上运行GDB,每当遇到断点时都会发现这一点
GDB问题BFD:重新打开/tmp/:没有这样的文件或目录
我看到一个bug打开了,但不确定是否有人知道这个问题的解决方案
问题在于gdb延迟加载某些节,但您已删除了共享库
一个修复方法是在gdb使用共享库时不删除它
另一个修复方法是修改gdb,使其不延迟加载部分。如果按照这种方式,延迟加载都是在dwarf2read.c中完成的
我在以下位置安装了一个崩溃处理程序:
/proc/sys/kernel/core_pattern
它通过管道将传入的coredump传输到一个文件,然后通过gdb提取stacktrace
问题是,有时这些CoreDump可能非常大(通常超过30GB)。在这些情况下,在应用程序挂起之前,用户会在coredump写入磁盘时一直等待
关于如何以非阻塞方式处理这些非常大的CoreDump,有什么建议吗?我不在乎coredump本身,stacktrace才是有价值的
我无法访问源代码,所以像这样的答案并
我正在尝试使用visual studio代码将配置设置为连接到运行gdbserver的远程C/C++gdb目标。目前是否支持此功能?如果是这样,我如何绕过这些限制:
地址和端口选项表明C/C++不支持它们
我可以强制代码使用特殊的远程启用版本的gdb,但它试图在本地运行目标应用程序,而不是连接到目标gdbserver平台
假设我能解决#1和#2,PowerPC远程目标是否会得到支持
这有点晚了,但我现在就安排好了。
我正在调试一个在远程ARM设备上运行的linux应用程序
我安装了VS代码的扩展
我使用T32加载bin文件和elf,并编写脚本从elf文件中提取Pc、Lr寄存器值。现在我有了的地址,比如说PC的地址是0xCCDDDD。现在我需要得到对应的符号。
我运行了gdb并使用了gdb info symbol0xccccdddd并获得了符号名。
但我需要知道T32本身是否有任何命令来获取符号名。或者我可以从一些命令中获取符号名称,如readelf或objdump。
提前感谢。打开窗口查看所有静态符号的命令为
sYmbol.Browse
要了解有关该窗口的更多信息,我建议检查TRACE
标签: Gdb
environment-variables
我想使用bash/gdb环境中的变量,并将其设置为gdb中的方便变量
(gdb) show environment
bar=1
(gdb) set $foo = (show environment bar)
(gdb) show convenience
foo=1
当然,我的第二个(gdb)命令返回一个错误。我看了很多,看看这样的事情是否可能。但也许我看错了方向。有人能帮忙吗?您可以使用内置Python来完成,如下所示:
(gdb) py import os
(gdb) py gdb.
我在gdb peda中找不到使用“searchmem”命令的示例,在标准gdb中,“find”命令还可用于查找感兴趣的指令,如下所示:
(gdb)find /b start_address,end_address,opcode1,opcode2,..,opcodeN
例如,要搜索小工具“pop ebx;ret”,我会键入gdb:
(gdb)find /b start_address,end_address,0x59,0xc3
如何使用gdb peda来执行此操作
更新:
用ropsearc
我需要用相同的mpirun(mpich)命令启动2个可执行文件(program1和program2),并且我正在尝试用gdb调试program1。我使用以下命令:
mpirun-n1gdb程序1:-n1程序2
该命令正确地打开了gdb控制台,但是如果我在mpi_init之后的某个地方设置了一个断点,屏幕上就会充斥着program2的标准输出。有没有简单的方法将program2(仅program2)的标准输出重定向到文件
我的快速解决方案是在program2中硬编码一部分stdout,但我确信一定
如果我为当前作用域的局部变量设置了一个观察点,它将在超出作用域时自动删除。有没有办法设置一次,并在进入同一范围时保持自动激活
是否还有设置条件监视点的方法,如如果var1==0,则监视var1?就我而言,这种情况不起作用。只要var1的值发生更改,gdb就会停止,而不是直到var1==0为真。我的gdb是GNU gdb 6.8-debian
我不确定我们使用的是哪种语言,因此确切的答案会有所不同,但是您是否可以将变量更改为静态、全局或动态分配(并且在函数返回时不释放它?)。这样,它的原始地址就不
我的机器中有GDB和CDB。我的Qt创建者正在使用CDB进行调试
我试图指向GDB路径,但它不起作用
如何使用GDB将Qt Creator设置为调试?确保您已将Qt Creator设置为“调试”生成配置(生成菜单->设置生成配置->调试)。这听起来可能很明显,但我不小心将我的设置为“Release”,并且花了数小时寻找gdb配置问题,当时Qt Creator忽略了我的断点,尽管我使用“Start debug”命令运行应用程序
还请注意,在这种情况下,重新配置Qt Creator进行调试构建可能不
我试图使用Eclipse CDT和cygwin gdb调试一个应用程序,如果我的代码调用Sleep,我将面临一个问题,看起来每当代码中遇到睡眠时,调试器似乎都会无限循环。我的意思是,它在睡眠后不会终止或碰到断点。
按pause键时,代码卡在sigint::INTERRUP上的一个线程上。
即使是我的调试器控制台窗口也会在控制台输出中抛出以下错误:
[New thread 5968.0x1f98]
Error: dll starting at 0x774a0000 not found.
Error
在客户处,第三方软件崩溃。进程和库被剥离(没有符号),调用堆栈不提供任何有用的信息。我所拥有的只是可能没有损坏的寄存器。这个第三方代码是用C编写的
现在,我已经使用gdb来调试更简单的问题。但是这个有点复杂。我认为寄存器和原始堆栈信息可以用来记录崩溃发生的位置,我需要这方面的帮助
不可能在客户站点部署非剥离二进制文件,也不可能进行内部崩溃复制。另外,我不熟悉这个第三方代码
我还需要以下方面的指针/站点/文档:
1) ELF和各种节标题。
2) 如何为库和进程创建符号文件(编译期间)。
3) 如何
如何打印%eax和%ebp的值
信息寄存器显示所有寄存器;信息寄存器eax仅显示寄存器eax。该命令可以缩写为i r如果您试图在GDB中打印特定寄存器,则必须省略%符号。比如说,
info registers eip
如果可执行文件是64位的,则寄存器以r开头。以e开头是无效的
info registers rip
这些可以缩写为:
i r rip
还有:
info all-registers
然后你可以得到你感兴趣的寄存器名-对于查找特定于平台的寄存器非常有用,比如NEON Q。。。在
看一看:
(gdb) x/x $esp
0xb720a621: 0x00000000
(gdb) info register eflags
eflags 0x200286 [ PF SF IF ID ]
(gdb) x/5i $pc
=> 0x15a965d <tables+11901>: popf
0x15a965e <tables+11902>: mo
标签: Gdb
google-nativeclient
我希望在mac平台上调试32位nacl exe。我无法调试它,因为在mac平台上我找不到32位的nacl gdb。有人成功地做到了吗?GDB for Native Client是在Pepper 23中发布的,因此首先检查您是否正在使用Pepper 23版本的NaCl SDK或更新版本。(要下载SDK的任何新版本,请从nacl_SDK目录下发布/naclsdk update。下载完成后,您应该看到pepper_23目录(或更新的目录)。使用该目录中的工具。)
在SDK中,GDB二进制文件位于以下位
清单项目1-4是我做的步骤。
列表项5描述了该问题
清单项目6提供了补充资料
我已经编译了一个C源代码,比如c1.C和-g标志
我还有一个
动态共享库,比如liba1.so,为所有源代码使用-g构建
它拥有的文件
我通过将c1.o(c1.c对象代码)与liba1.so链接,构建了可执行文件exe1
我做gdb exe1。我能一步一步地通过c1.c的来源。当c1调用共享库时,我还能够在共享库中的函数上设置断点
但是,当我尝试单步执行函数时,它会说“单步执行直到退出函数foo1,它没有行号信息”,它
我本以为这个问题已经问过了,但我找不到。如果是的话,请容忍我
我正在debian安装中尝试对现有程序进行修改
这个名为foo的程序在编译时会创建一些自己的共享库。我想调试这个程序并进入一个本地共享库,称之为libbar.so
但是,由于这是一个现有的程序,所以已经有一个/usr/lib/libbar.so,我不想覆盖它
那么如何让gdb使用本地libbar.So呢
这个名为foo的程序在编译时会创建一些自己的共享库
您的意思是程序在运行时将自己的libbar.so的副本写入磁盘吗
这是非常不寻常
当打开和关闭TUI模式(使用Ctrl+x,a)时,gdb通常仅使用一半屏幕(因此cmd和src窗口各只占用屏幕的1/4),并且winheight cmd+5无法工作
如何防止或修复此问题?这显然是与readline相关的问题
显然有人已经研究过了:所以希望它能在更新版本的gdb中得到修复
同时,当问题发生时,可以使用以下乱码来解决问题:
切换TUI模式,直到出现问题
在运行gdb的计算机上打开另一个终端,并使用类似于pkill-SIGWINCH-gdb的命令将SIGWINCH发送到gdb进程
切
标签: Gdb
command-line-argumentslldb
我习惯于这样运行gdb:
$ gdb --args exe --lots --of --flags -a -b -c d e
...
(gdb) r
lldb有等价物吗?是的,它只是--而不是--args。从帮助中:
lldb -v [[--] <PROGRAM-ARG-1> [<PROGRAM_ARG-2> ...]]
您也可以先启动lldb并使用:
(lldb) settings set target.run-args 1 2 3
(lldb) run
或:
(
当运行我的一些二进制文件时,我发现GDB没有转储数组很奇怪,我不知道为什么这只发生在一些可执行文件中
宣言非常简单:
tbl_account_t accounts[MAX_ACCOUNTS];
当我打印数组(只是任何数组)时,我得到以下结果:
(gdb) print accounts
$16 = 0x618d20 <accounts>
我确实有数据在里面:
(gdb) print accounts[1]
$18 = {email_len = 16, passwor
我真正做的是在设置或清除单个位时设置一个观察点。我通过在包含位的字上设置一个观察点,然后使其以*word&mask为条件(用于设置,或(~*word)和mask用于清除)
问题是同一单词中的其他一些位可能会被修改,而条件可能恰好已经匹配。如果我有新旧值,我可以设置一个条件($old^$new)&mask)
我查看了pythongdb.Breakpoint类,但它似乎也没有收到此信息
我想我可能会发疯,设置一个命令列表,每当*word的值发生变化时记录当前值,并将其用作$old。但是有一半的时间我
x命令可以检查GDB中的内存。像
x/4xg 0x60400
现在我将定义我自己的x comand,它使用指定的重复计数检查内存,如:
define myXCommand
set var &repeatCount=$arg0
x/(???)xg 0x60400
end
我已经尝试了很多方法将variant repeatCount传递给x命令,但最终失败了。我的问题是如何将repeat count传递给x命令?如果有人能提供帮助,我将不胜感激。大多数表达式中都可以使用方
我正在调试一个远程目标,似乎软件断点不起作用,但硬件断点确实起作用
我希望能够使用stepi命令,但gdb似乎坚持使用软件断点
有没有办法强制gdb为stepi使用硬件断点
目标是通过blackmagic探针调试的ARM STM32芯片。一种解决方案是将内存区域标记为只读,从而强制gdb使用hw断点
即,如果我的代码在我运行的地址0x8000000-0x801000上运行
mem 0x8000000 0x8010000 ro
有人实际使用过可逆调试器吗?谷歌发现的唯一产品是。它显然只适用于Linux 你要找的词可能是“全知调试”
这里有一个:
UNDODB页面有一些链接到(昂贵的)商业调试器。 VS 2010应该有这样的东西,我想。 < P>可以考虑使用VMware的重播调试,在VMware工作站的最新版本中可用,如参见。您可以在下载试用版,该试用版可与Visual Studio一起使用
(免责声明:我为VMware工作,但不在本产品上。)最新的gdb 7.0版(本周发布)支持在许多平台上进行反向调试(例如,Vi
假设以下是asm代码
8048deb: e8 41 05 00 00 call 8049331 <explode_bomb>
8048df0: 03 73 f4 add -0xc(%ebx),%esi
8048df3: 83 c3 04 add $0x4,%ebx
8048df6: 8d 45 f8 lea
这正常吗?我发誓直到最近它只设定了1个断点。如何使其仅在运行文件中设置断点,而不在源文件中设置断点
(gdb) break main
Breakpoint 1 at 0x1dbf
Breakpoint 2 at 0x1ed8: file arrays.c, line 17.
warning: Multiple breakpoints were set.
Use the "delete" command to delete unwanted breakpoints.
(gdb)
有多个主符号:
我来自gdb,在那里我可以通过l func符号列出源代码,然后按enter键查看更多定义
如何在windbg中执行此操作?只需转到文件->开源文件
如果要反汇编func类型u func如果要打开源类型。打开-a func
如果要在命令窗口或cdb中列出源代码,请使用lsa func
您可以用地址替换func。如果只有.pdb,没有源文件怎么办?可能有重复的
我已经使用gdb十年了,从来没有见过这个问题。我升级到GDB7.4,问题依然存在
我在RHEL5上调试了一个CiLK多线程C++应用程序。seg故障时停止执行。当我要求gdb打印某些变量的值(它们是boost::intrusive_ptr对模板化对象实例的引用)时,gdb将打印正确的值,但也将在很短的时间内在所有线程上恢复执行。我怀疑它会继续执行,因为我的更多调试打印语句会滚动到终端(这不仅仅是清除缓冲区——我可以继续打印它,它也会继续执行)。这种持续执行的短暂爆发导致我正在跟踪的变量的值发生变
我正在使用GDB和JTAG设备Abatron BDI2000调试运行在摩托罗拉M68332上的程序
68332没有任何硬件断点寄存器。它具有非常原始的调试特性。
构建工具不生成“elf”文件,因此没有用于GDB的符号。
我正在调试的程序也在Flash中运行
事实上,68332只有一条调试指令ti。ti自行执行下一个装配说明的步骤。ti xxx将逐步执行,直到到达地址xxx为止。[是的,这是穴居人时代,冷锤和凿子:]
我能够使用GDB和target remote连接到BDI2000并发出GDB命令
有没有人经历过以下情况
出于调试的目的,我只使用了一个mpi进程,通过“mpi run-NP1”启动了基于mpi的程序。然而,当我调试程序时,重复的介入和越级经常发生
比如说,我一行一行地跟踪源代码,直到我达到了一个兴趣点。然后我试着插手,输入“n”,希望继续一行。但是,调试器返回函数的第一行。只有在我经历了两三次之后,我才能继续
给人的印象是调试器并没有做错什么,因为结果被认为是正确的。我真的很好奇为什么会这样
提前谢谢 观察到的行为通常是编译器优化活动的结果。优化可能会导致二进制代码不完全遵
我遇到了一个GDB bt的问题。我在调试期间处于中断上下文中,因此我只能看到当前堆栈,所以回溯跟踪将只显示少数我不感兴趣的调用。然而,在我们编写的嵌入式软件中,每当恐慌发生时,我们都会保留信息的全局结构。它指向崩溃前的堆栈
我的问题是,我可以让GDB从我已知的地址做回溯跟踪,假设硬件中没有发生重新映射
我正在使用GDB7.0和olimex,我正在调试定制的基于ARM的芯片
向您致意您使用的是哪种gdb版本?它应该能够打印中断处理程序上方的整个堆栈跟踪。不管怎样,您是否尝试过直接覆盖堆栈和指令指针
我知道如何使用info threads查看线程信息,但现在我想在断点命令中打印它们
可能吗
e、 g
在手册中搜索“$\u thread”便利变量。它保存当前的线程编号
break XX
commands
printf "tid=%d, item1=%s, item2=%d ...\n", some_command, a, b
end
我是GDB新手,无法让命令历史自动完成/向上箭头指向旧命令
在我的根目录中有一个.gbd_init文件,我的工作目录中也有一个相同的文件:
set history save
set history filename ~/.gbd_history
set history on
set history expansion on
我的根目录中还有一个空的.gbd_历史文件
GBD中的“显示历史记录”给出:
(gdb) show history
expansion: History expa
标签: Gdb
embedded-linuxgdbserver
我正在试着在我的主板上调试一个运行嵌入式linux的程序,我的主机系统是Ubuntu。我对gdbserver有一个大问题。你看,我的电路板没有以太网接口,而是一个串行设备,我用它作为控制台,我注意到你可以用一个串行设备在gdbserver中进行调试,尽管考虑到在视频或书籍中使用gdbserver的人都在TCP模式下使用它,我找不到这样的例子,但我不能这样做。
因此,我所做的只是以这种方式在板上运行gdbserver:
root@DM368# gdbserver /dev/ttyS0 hello
标签: Gdb
forkosx-yosemitelldbsegmentation-fault
给定以下代码:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int ac, char** av) {
int status;
pid_t cpid = fork();
if(0 == cpid) { /* Child */
return *(volatile int*) 0
假设我在主函数中定义了一个名为var的变量。我给它设置了一个观察点。然后输入另一个名为func()的函数。此时,监视点可能会被删除,因此我无法访问该变量。有什么方法可以让你随时保持观察点
另外,我知道我可以使用printmain::var这样的语法来打印变量的值。但这还不够。有什么好主意吗?gdb的一个奇怪之处是,watch试图尊重表达式所有组成部分的范围。因此,如果您watch var,并且var超出范围,则监视点将被删除。这也适用于更复杂表达式的元素,如watcha+b
当然,这是有道理的,
我需要使用模拟器,首先,我想做一些非常简单的事情:逐步完成启动代码的前几条指令。在这里:
重置\u处理程序:
movs r1,#0
b LoopCopyDataInit
CopyDataInit:
ldr r3,=\u sidata
ldr r3,[r3,r1]
str r3,[r0,r1]
加上r1,r1,#4
LoopCopyDataInit:
GDB就是这样的:
e:\devtools\Olimex\examples\STM32-P103\u UART1>e:/devtools/Olime
我不知道如何在Gdb中使用Python API完全定义新参数。源代码中包含的脚本包含以下内容:
python
param = gdb.Parameter("test", gdb.COMMAND_NONE, gdb.PARAM_OPTIONAL_FILENAME)
param.set_doc = "This is the documentation" --> throws exception
end
我使用以下命令更改并在Gdb中显示其值:
(gdb) set test "hello wo
标签: Gdb
elfobjdumpreadelf
我有一个十六进制偏移量,比如0xcccddd。使用gdb info symbol 0xcccddd我可以在节_name中获得符号名,例如fn()。
如何使用readelf或objdump命令执行此操作。
或者不运行gdb的任何其他命令
编辑:
在使用下面的命令之后
objdump -d --start-address 0xcccddd --stop-address 0xcccdde filename.axf
我越来越
filename.axf: file format elf32-li
我正在开发需要大量测试的安全关键软件。目标处理器Cortex-M4拥有丰富的应用资源,但单元测试和集成测试如果合并,将比板载闪存/RAM大得多。它们被设计为从gdb运行,同时使用半宿主来卸载测试结果。我们需要的是一种自动化测试的方法,这样它就可以在不需要每次测试人工干预的情况下运行
测试程序在Eclipse中使用OpenOCD和Segger调试器前端运行良好。这些要求每次测试配置,然后手动启动测试。将有30-50个测试程序,因此对于连续集成或简单的批处理运行来说,这是不可行的。
我一直在寻找可能
我知道-file list exec部分,但它似乎没有在GDB 10.2中实现(目前的版本)。我想要一个GDB/MI命令,而不是info-proc-mappings,因为我想要一种更简单的方法来解析结果,而且我想知道是否有其他方法可以替代-file-list-exec-sections命令,因为它似乎消失了。在GDB/MI中info-proc-mappings似乎工作得很好。您要求的是等效但不同的命令吗?info proc mappings在流记录中给出其输出(~“0x40000 0x50000
嗨,我是GDB的新手。我使用了“设置登录”命令。它创建一个默认文件“gdb.txt”来存储输出。但是,我无法找到该文件并查看数据。你能告诉我文件在哪里吗?在当前工作目录中。在(gdb)提示符下尝试pwd命令。并不总是在pwd中创建gdb.txt文件。
它必须通过在gdb终端中执行命令“set logging on”来明确指定。对于我来说,pwd给出了我希望“gdb.txt”文件所在的文件夹,但没有文件显示日志记录说明应将其写入所述文件。
标签: Gdb
reverse-engineeringchecksum
我想创建一个函数来计算一个数据块的校验和,就像它用于商业程序一样。
我尝试过使用gdb或REC反编译器,但似乎我没有足够的技能来做这件事。我可以使用什么工具来反编译此函数?
有没有其他方法可以采用,比如尝试使用标准校验和函数来查看使用的是哪一种
我没有技能
逆向工程需要基本的汇编知识(除非你是逆向工程Java、C#或其他基于VM的语言)和一般编程知识。考虑到这一点,您可以使用:
用于Ida的Hex-Rays反编译器,但价格昂贵
没有反编译器的普通Ida,它是免费的,但缺乏功能
普通奥利德
对于所
我正在调试一个程序,它会在特定的例程中触发一个不需要的信号陷阱。此信号在库中触发,但回溯中始终显示相同的调用方。如果调用方是[某个函数],我如何告诉GDB忽略这个信号,而不是打断它
我曾尝试使用跳过函数[某些函数]甚至跳过文件[触发SIGTRAP的文件](from),但GDB仍然在这一行中断。而且continue似乎也不支持条件句。我会选择任何不需要修改调试程序的解决方案,包括用于GDB的Python脚本。如果相关,您还可以假设在触发SIGTRAP之前,将错误写入stderr
两年前,有人问。这
我正在阅读《炮弹编码员手册》,试图解决书中提出的问题。然而,鉴于这本书是十多年前写的,很难理解。我遇到的一个问题是,在我分解使用它的函数后,在调用get和printf时设置断点。每当我设置断点并运行它时,我的程序就会停止。我很想知道为什么。这是第2章分配,处理堆栈上溢出缓冲区的特定部分。我正在64位Kali Lix vim上运行我的代码。这是源代码
#include <stdio.h>
void return_input (void){
char array[30];
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 37 页