是否可以使用gdb保存/转储核心文件?有时我想保存文件以便以后分析。在gdb中发出“生成核心文件”命令
(gdb) help generate-core-file
Save a core file with the current state of the debugged process.
Argument is optional filename. Default filename is 'core.<process_id>'.
(gdb) break main
Breakpo
我试图从我正在阅读的一本组装书中得到一个简单的示例。我正试图让gdb使用我正在用NASM汇编程序汇编的简单汇编程序。下面是代码和elf格式的对象文件
; Version : 1.0
; Created Date : 11/12/2011
; Last Update : 11/12/2011
; Author : Jeff Duntemann
; Description : A simple assembly app for Linux, u
标签: Gdb
stackframescoredump
我想访问一个没有调试符号的程序的核心转储中存储的帧(我想在C中这样做)。当我打开程序和GDB内部的核心转储时,我会得到一个堆栈跟踪,其中包括函数名。例如:
(gdb) bt
#0 0x08048443 in layer3 ()
#1 0x08048489 in layer2 ()
#2 0x080484c9 in layer1 ()
#3 0x0804854e in main ()
所有函数的名称都存储在.strtab部分的可执行文件中。如何使用不同的帧建立堆栈跟踪?在批处理模式下运行
我的意思是,不是被调试的程序出错,而是gdb本身
所以我只是想创建一个断点;当我按下gdb时,它就死了
我喜欢相信这不是一个bug,而是背景中的一些混乱。因为此计算机上的英特尔编译器icc已更新
此计算机在双插槽计算机中运行两个ssh会话,每个计算机有2个Intel Xeon X5650@2.67GHz 6核,总共12个,24个多线程,48 Gb的DRAM NUMA,2个GPU Tesla C2070和Tesla C2090[此计算机未正确安装]。这是运行Cent操作系统:
~$ cat /pr
我所处的情况是读取观察点非常方便。查看lldb的帮助,我可以找到watchpoint命令,但它似乎只支持write watchpoints(一般来说,写watchpoints有用得多,但在我的情况下不支持)
我知道gdb有一个rwatch命令来设置读取观察点。lldb是否有任何等效项?监视集变量|表达式都采用-w/--watch参数,指定写入(默认值)、读取或读取。e、 g
(lldb) wa s v -w read myvar
顺便说一句,我这次显然只是用gdb来完成我的工作。哦,我明白了。
我试图将gdb反汇编输出(disas[address])与源代码相匹配。我知道这样的映射可以使用(gdb)info line*address来找到匹配的行。但是,我不太了解反汇编输出的格式。具体来说,+4722和+4281是什么意思
0x00002ad61e45bd02 <+4722>: jmpq 0x2ad61e45bb49 <MsgManager::ForwardMsg(boost::shared_ptr<Channel>, boost::shar
我正在使用Clang编译器,并用它创建了一个可执行文件。我正在尝试使用GDB进行调试。但是,在初始化gdb时
gdb executable core
我收到以下错误:
Dwarf Error: Cannot handle DW_FORM_flag_present in DWARF reader [in module /xxx/yyy/executable]
有人知道这个错误吗?您的gdb太旧了。DW_FORM_flag_是一个矮人4特征。对它的支持于2010年4月添加到gdb中。至少,GNU
我试图修改gdb下的可执行文件。即使内存已更改,但相应的可执行文件不会更改,因此下次运行该程序时,修改将消失
我用-write选项启动了gdb。
我还尝试设置写入,然后重新加载exec文件
我用set{unsigned char}addr=0xf更改了内存
但相应的文件没有更改
但相应的文件没有更改
很难说您实际修改的地址是什么,所以您的更改是否应该修改二进制文件
在过去,我发现在修改二进制文件后,我需要立即退出。如果我做的不是退出(例如运行),那么GDB将放弃我的更改,但是如果我退出,那么更改
我在使用lldb进行调试时看到了asm,它们是一种查看c/cpp代码行的方法吗?
请参阅下图了解更多信息
您是如何构建a.out的?你告诉它生成调试信息了吗?g++xyz.cpp然后lldb./a.out如果“g++”是gcc,那么添加-g(per)怎么样?太好了。它的工作和良好的链接提供,将通过它。谢谢
对于在RHEL5 32位下运行的自定义程序,我有一个非常奇怪的问题
这是一个用C编写的商业程序,所以我没有源代码。无论如何,当我运行这个程序大约50%的时间时,我随机得到了分段错误(信号11)。例如,当我使用相同的参数和条件运行该程序10次,5次时,它发出信号11次,5次成功完成
我将ulimit设置为unlimted以收集核心转储。我能够获取核心转储文件并启动gdb以查看回溯。我可以看到程序在出错之前在哪个函数上停止
我在gdb下开始了这个项目:
gdb[程序名],然后输入“运行[参数1][参
这是调试器下载的链接:
我点击了第一个链接并下载了7.10,但我不确定如何解包这个文件扩展名gdb-7.10.tar.xz.sig我尝试了以下命令,但无效$tar xf gdb-7.10.tar.xz安装,然后brew安装gdb。或者学着像现在所有的酷孩子一样爱lldb。当我这样做的时候,我得到了一个错误‘错误:没有gdb可用的公式’OK-它应该会起作用-请看:-如果没有,那么考虑学习使用标准的苹果lldb-它在很多方面都比gdb好”
我想通过打印出函数执行的每一行来跟踪函数的执行情况-在gdb中,我可以使用dprintf。由于它是一个大函数(从myFile.cpp中的第113行到第200行),因此我提出了以下循环,在函数的每一行上设置dprintf类型断点:
set $n=113
while ($n<200)
dprintf myFile.cpp:$n, " myFile:testF %d\n", $n
set $n=$n+1
end
。。。但是,if不适用于相应的dprintf格式字符串,因为gdb变量$n没有扩展
我通过将“打印变量值,然后继续”代码分配给断点,实现了printf()功能:
break main.c:18
commands
print myVar
cont
end
到目前为止,这一切都很顺利。然而,在AFAIU中,它需要与目标(在我的例子中是微控制器)进行多次通信:
微控制器在遇到断点时发送信号
GDB立即询问myVar
MCU发送myVar值
GDB指示MCU继续
这些步骤会导致明显的抖动,因此MCU上的应用程序的行为非常奇怪
是否有机会告诉GDB一次性完成上述步骤,比如:“告诉我my
当变量达到GDB中的特定值时,是否有设置断点的方法?例如,一个变量取以下值:1 4 8 10 3 2 9 13 11,我想在这个变量达到9时设置一个断点。您可以使用它
watch n > 9
当布尔表达式n>9更改时,…应中断;也就是说,当n从小于或等于9变为大于9时,反之亦然。是,设置
break ... if value==9
我真的迷路了。也许你们中的一些人能给我指出一个正确的方向
我正在用ANSIC开发一个工具,在MinGW上使用GCC。该工具只能从命令行运行。可能只在windows计算机上。它在本地详细阐述一些数据,并生成供其他程序使用的文件。基本上,它做了大量的数学运算和一些文件处理。没什么特别的。我觉得没有必要在这里发布全部1000多行来进行检查
我用GCC-ansi编译它,确保没有任何警告出现。随着事态的发展,一切都进展顺利。但最近我开始发现几乎是随机的断层。我检查了最近所做的更改,但什么也没找到。我删除了
给定以下代码:
1: int main(int argc, char **argv) {
2: int i;
3:
4: i = i + 1;
5:
6: ...
7:
8: }
当您在上述代码的第2行设置断点并在GDB中开始调试时,执行实际上会在第4行停止。这当然是正确的行为,但在调试之前,是否可以查询GDB以获得正确的停止点编号。。。就在创建断点之后 您可能正在寻找
info b
(它是信息断点的缩写),并在第一个“
[b77d0424]打开(“etc/shadow”,仅0rdu)=-1次访问(权限被拒绝)
每次运行[b77d0424]时,都会更改为另一个地址
我不能使用gdb*0xb77d0424然后使用c来查找lib64/libc.so.6
这似乎与linux编程书中提到的不一样
在虚拟盒中运行Ubuntu13.04之后
每次运行[b77d0424]时,都会更改为另一个地址
这是因为,您可以使用setarch-R命令禁用它
默认情况下,GDB也会禁用地址随机化,但在GDB和strace下获得相同地址的可能
例如,我的代码是:
int main(){
f();
g();
while(1){
h();
}
..
}
我在f,g上设置了断点。当然,程序将在f()/g()处停止,但当我键入“c”时,它将继续运行。目前我必须键入“CTL+C”来停止它。程序也会被杀死
如果程序正在运行,有没有其他优雅的方法可以在不终止程序的情况下退出gdb
谢谢
我必须输入“CTL+C”来停止它。程序也会被杀死
键入“CTL+C”,然后gdb将捕获SIGINT,然后
所以我知道我当前的区块在epb和esp之间
有没有办法按以下方式打印我的堆栈:
让我们说len=ebp esp
我希望gdb上的命令看起来像这样
x/lenx$esp
所以我要为正在执行的当前函数翻出堆栈上的内容?
我可以使用如下显示方式来执行此操作:
显示/lenx$esp
是否可能有一个每次都会改变的变量
似乎display不允许此操作。因此,您可以定义自己的命令,并在需要查看函数堆栈时简单地调用它:
define display_stack
eval "x /%dbx $esp", $
标签: Gdb
command-line-interfacetui
我正在尝试使用gdb进行调试。我更喜欢使用tui模式,因为它允许我查看整个源代码,而不仅仅是一行代码。但有一个问题:每当程序caffe在stderr上输出某些东西时,输出就会扭曲tui接口。请参见下面的快照以了解说明:
这是gdb tui固有的局限性还是有任何方法可以解决这个问题?我从未找到解决此类tui烦恼的方法,最终放弃并转向更可靠的方法:
使用GDB Python API获取GDB数据
每次停止后,将一些预先配置的视图输出到stdout,而不是将终端置于magic ncurses模式
标签: Gdb
cross-platformlldb
我发现了同样的问题,但经过大量的搜索,我不知道如何在LLDB中实现它
这些是解决方案,但我不知道LLDB的等价物是什么。有人知道吗
(gdb)共享信息->这表明所有共享库符号都已读取
但仍然可以追溯到bt显示“没有任何可用的符号表信息”用于任何函数
有人能解释一下这个问题是什么吗?如何解决此问题并获得有意义的追溯?信息共享输出中的那一列总是令人困惑。这并不意味着实际上存在调试信息——它只是意味着gdb试图读取它。这些信息实际上对普通用户并不是那么有用
要想知道你是否真的有调试信息是非常困难的。一种方法是对各种文件使用readelf-WS,并查找相关的调试部分。这会告诉你它是否存在
然而!这还不够。可能缺少一个部分(除非你一直
是否有可能在内核执行过程中(通过插入一些C语句或其他方式)故意在特定点崩溃内核,然后使用普通gdb程序收集corefile进行分析?
请大家分享一下步骤和需要做的事情
是否有可能故意使内核崩溃
当然:只需在所需位置插入对panic()的调用
最简单的方法是使用。内核变成了一个普通程序,您可以在GDB下以通常的方式执行它,设置断点,查看变量,等等
如果您需要执行“裸机”执行,您可能应该启动或。实际上,我只想在linux内核代码上执行实时gdb。但是我不知道如何在我的虚拟机设置中实现这一点。请你看一
标签: Gdb
shared-librariescoredump
我知道我可以使用核心转储文件来找出程序出错的地方。然而,有一些错误,即使你用核心文件调试它,你仍然不知道为什么会出错。所以我想传达的是,gdb和核心文件可以帮助您调试的bug的范围是有限的。这有多有限
例如,我编写以下代码:(libfoo.c)
当我运行它时,/libfoo.so,我遇到了分段错误,这是因为我以错误的方式编译了可运行的共享库。但我想知道到底是什么导致了分割错误。因此,我使用了gdb libfoo.So.1.0.0 corefile,然后使用bt,得到了以下结果:
[xhan@lo
如何打印GDB设置的值?例如,如果我使用命令
set width 5
稍后我想知道宽度的值,怎么做?我试过了
print width
print &width
set width?
但是没有一个打印出值5。任何帮助都将不胜感激。使用显示宽度
例如:
(gdb) set width 100
(gdb) show width
Number of characters gdb thinks are in a line is 100.
它应该以00退出。我需要使用GDB调试这个问题。这个程序是多线程的,我不确定这个线程上运行的是什么代码
最好(最简单、最有效)的方法是什么来捕获低级进程中的退出并获得回溯,以便我可以看到线程退出的位置
我尝试过设置在fork-off上设置detach,但结果只是挂起了程序
在低级进程中捕获退出并获得回溯以便我可以看到线程退出的位置的最佳方法是什么
你的环境是什么?Linux,还有别的吗?Linux,CentOS5。补充问题
(gdb) catch syscall exit_group
我如何在C中运行while循环,比如说N次?
例如,我到达这个函数,然后我想运行while()块5次
// while there are customers
while (customers_length)
{
// check if there are customers waiting
if (index == initial_customers_length)
customers_are_waiting = 0;
我想定义一个新命令,它基本上在一行上设置一个断点,打印某个变量的值,然后继续执行。不幸的是,我有问题。这是我正在使用的代码
(gdb) define print_and_continue
Type commands for definition of "print_and_continue".
End with a line saying just "end".
>break $arg0
>command $bpnum
>print $arg1
>continue
这是mygdb的显示
(gdb) x/20bx 0xbffff2c0
0xbffff2c0: 0xd4 0xf2 0xff 0xbf 0x16 0x8f 0x04 0x08
0xbffff2c8: 0x05 0x00 0x00 0x00 0x00 0x00 0x0c 0x42
0xbffff2d0: 0x6b 0x00 0x00 0x00
是否可以将其更改为一行4个字节?使用x/20wx
(g
我安装了cygwing++和gdb。g++可以工作,但gdb在启动时不输出任何内容。它似乎在启动后就被阻塞了。什么会导致这种行为
当我降级到gdb版本7.10.1-1时,它工作正常并输出
但对于任何更高版本(7.12.1-2、8.0.1-1、8.1.1-1、8.2.1-1、8.3.1-1、9.2-1、10.1-1),我都没有得到任何输出。
此问题发生在我的旧Win7 32位PC和当前的Win10 64位PC上。
是什么导致了这个问题
从Cygwin终端运行GDB也没有帮助:
该问题是由GDB包
我正在用gdb调试一些Fortran代码,它一直在逐步遍历内部Fortran函数的C代码。例如,如果我试图跳过一个write调用,它就会跳入write.c。有没有办法阻止这种行为?我使用的是CentOS 6.3,gdb 7.2和gfortran 4.4。通常我认为“下一步”应该可以工作。但我不懂Fortran,也许发生了一些有趣的事情
另一种方法是确保没有安装Intrinsic的调试信息。如果您尝试“单步”进入没有debuginfo的函数,gdb将自动跳过这些函数
最后一种方法是升级您的gdb并
标签: Gdb
stackmemory-segmentationgdt
如果我们用gcc编译一些C代码,我们通常会看到以下汇编结果
0x08048494 <+0>: push ebp
0x08048495 <+1>: mov ebp,esp
0x08048497 <+3>: and esp,0xfffffff0
0x0804849a <+6>: sub esp,0x130
0x080484a0 <+12>: mov eax,DWORD PTR [ebp+0xc
有时我使用“-pid”命令参数运行GDB,有时我使用GDB“运行”程序。如果我希望在这两种情况下都使用1个gdb命令文件,我会遇到一个问题,因为您无法继续未运行的进程,并且无法在进程运行时键入“run”
也就是说,这里有一个简单的命令文件:
br main.c:30
commands
p foo
c
end
# what can i put here, so that the command file will work in both situations?
如果我将“run”放在命令文件中
我的系统有GDB7.2和7.4,它们都没有dprintf功能。我在上查看了发布页面,但没有说明是哪个版本首先发布了该功能
我试图避免使用最新的gdb,因为我担心它可能需要新的版本依赖库,并且我没有管理员权限来安装它们。所以我想知道7.4之后的第一个版本是什么,它包含了dprintf
我试图避免使用最新的gdb,因为我担心它可能需要新的版本依赖库,并且我没有管理员权限来安装它们
gdb的依赖关系非常小。我怀疑这将是一个真正的问题。此外,如果是,您也可以构建和安装库,而无需任何特殊权限
也就是说,g
我有一个指向结构的指针,可以使用print/x(*s)在gdb中打印它
然而,这给了我:
…,强度=2'\002'},{distance_2cm=3045,强度=3'\003'},{distance_2cm=14735,强度=7'\a'},{dis
距离2cm=3345,强度=3'\003'},{距离2cm=14272,强度=7'\a'},{距离2cm=3735,强度=
2'\002'},{distance_2cm=14617,intensity=6'\006'},{distance_2cm=4
gdb向后兼容较旧的gdbserver版本吗?它能看起来像在工作,但却默默地失败吗?
特别是,我有一个带有gdbserver 7.11.1的系统,我无法升级,但我只有gdb 8.1用于该目标,我宁愿不编译gdb的旧版本。是的,用于gdb和gdbserver之间通信的远程串行协议绝对应该向后兼容。如果出现任何问题,特别是在最近的7.11.1和8.1之间,我认为这将被视为一个bug
也就是说,我不知道在GDBServer的旧版本和GDB的新版本之间进行了任何重要的测试,所以有可能会出现bug
我认为
我在x86_64位ubuntu虚拟机上玩堆栈缓冲区溢出的游戏,我想知道我是否可以在.gdbinit文件中定义一个函数来打印堆栈金丝雀?在执行mov-rax,QWORD-PTR-fs:0x28指令之后,我当前的进程正在中断,然后在到达断点之后,检查rax中的堆栈金丝雀,但这有点烦人,我想知道是否有更简单的方法 如何编译代码?
我想使用frame apply all执行backtrace full(bt full)-类似于gdb中的步骤,在这里我收集并发出关于每个帧的更多信息
使用以下方法进行基本操作相对简单:
set print frame-arguments all
set print entry-values if-needed
set print pretty on
set print frame-info source-and-location
define frameinfo
echo locals:\n
我正在尝试在EclipseCDT版本6.02中使用gdb/mi调试器。在调试过程中,我可以轻松地一步一步地完成程序,直到看到下面的代码段
ENUM_START_TYPE My_Class::some_function( const char * c, const char * e)
{
ENUM_START_TYPE result = GENERIC_ENUM_VALUE;
if ( c[0] == '<' )
{
result = do_some
我使用print(CEthPacket*)0xeb609a0检查给定地址处的对象,并获得表达式中的语法错误,靠近“'0xeb609a0”。
我做错了什么
编辑:
CETHOPACK是C++类,我在GDB FEDORA(687.37。EL5)。 < P>您没有在哪个平台上说GDB的版本,或者什么 CEthPase。
我的第一个猜测是您应该尝试打印(struct CEthPacket*)0xeb609a0。我刚刚遇到了一个非常类似的错误。这是因为我试图引用的对象未在当前堆栈帧的范围内定义。尝试更改为
我可以使用以下命令转储gdb中的所有整数寄存器:
info registers
对于xmm寄存器(英特尔),我需要一个如下文件:
print $xmm0
print $xmm1
...
print $xmm15
然后找到那个文件的来源。有更简单的方法吗?罚款单上说:
最后一个是您想要的。如果您只想打印xmm寄存器,则可以使用info registers sse(或缩写i r sse,甚至i r s)
与仅打印fpu寄存器类似,您可以使用info registers float(或i r f)
标签: Gdb
qnx-neutrinomultiple-processes
我正在编写一个程序,该程序由几个独立的进程组成,所有进程都运行在嵌入式QNX RTO上,没有太多细节。它们没有父子关系,它们都是使用spawnlp(P_NOWAIT,…)生成的,并且它们都使用操作系统提供的IPC机制相互通信
当我使用GDB进行调试时,我在工作的过程中遇到了一个断点,我的所有线程都会暂停,这很好。但有没有办法让它暂停执行我的其他进程?现在发生的事情是,当我的进程暂停时,所有其他进程继续运行,因此所有IPC队列都满了,等等
提前感谢,
HF您可以将GDB命令列表与每个断点相关联。因
如何重定向此命令的输出:
(gdb)x/a$esp
0x22ff30:0x403064
为此:
(gdb)x/s 0x00403064
0x403064:“\n按键(q表示退出)?”
(gdb)
我的意思是:
(x/a$esp)|(x/s)据我所知,在GDB中重定向命令的输出是不可能的。
不过,还有另一种方法:
x/s*(void**)$esp
这将检查存储在堆栈顶部的地址处的内存
我试图调试一个程序,当它不在断点时,它经常会导致GDB停止并显示SIGTRAP。它发生在加载动态库和其他普通内容时。在我的断点最终被命中之前,大约有1000个这样的陷阱发生,所以手动“继续”所有这些不相关的陷阱是不可行的。但是如果我使用命令handle SIGTRAP nostop noprint,那么GDB将不会在我的断点处停止
似乎必须有一种方法来教育GDB,以便它了解哪个SIGTRAP适合停止,哪个不适合停止。显然,GDB知道它是否在断点处,因为输出非常可靠地不同:在断点处,它提到“断点”
标签: Gdb
static-linkinggethostbyname
GDB基于RHEL-4.7构建。我在RHEL-6.3上运行GDB。如果GDB是动态链接的,那么一切正常。如果GDB是静态链接的,我得到
(gdb) target remote :2107
localhost: unknown host
:2107: No such file or directory.
当静态构建GDB时,我们收到一条警告消息:
warning: Using 'gethostbyname' in statically linked applications requires a
我有一个带有std::string的内核转储,我想在gdb中检查它。打印它会将其内容作为以null结尾的字符串提供给我,但是如何访问其他std::string属性,例如大小和容量?尝试访问s.size()会直接导致一个错误,“如果没有要调试的进程,就无法执行此操作。”首先,禁用任何漂亮的打印机以查看您尝试打印的结构的原始成员变量
(gdb) disable pretty-printer
对于许多STL类,它们的成员(希望)不太难理解。例如,在禁用“漂亮打印”的情况下打印std::vector,
标签: Gdb
qt-creatorremote-debugginggdbserver
我一直在为嵌入式Linux目标设置远程调试。我已经测试了目标上运行的gdbserver和工作站上运行的gdb客户端的正确组合。我可以启动服务器并在工作站端运行:
(gdb)远程目标10.28.22.226:2345
我可以列出源代码和步骤
在Qt Creator中,我配置了一个设备。在该窗口中,我指定了GDB服务器可执行文件:gdbserver(参见pic)
我还在“构建和运行”调试器选项卡中配置交叉调试器,如下所示:
在本例中,我已经在目标端口2345上用我的可执行文件手动启动了gdbse
我使用的是Debian9.4,uname-a显示的内核版本不同,实际的内核版本是什么?“4.9.82-1+deb9u3”是什么意思
Linux debian 4.9.0-6-amd64 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) x86_64 GNU/Linux
apt get source linux可以得到当前内核的源代码,然后我可以得到原始内核tar文件和debian补丁
$ls
linux-4.9.82
在gdb中,如果你有一个指向某个东西的指针,你可以在打印它之前强制转换它
例如,这项工作:
print *(int*) 0xDEADBEEF
但是,如何打印std::vector?特别是一个std::vector
如果是std::string,我可以使用std::uucx11::string,它输出什么std::string,但我无法说服gdb喜欢std::vector(作为示例)。引用它没有帮助,正如它所说,在当前上下文中,没有符号“std::vector”。一种方法是使用类型的损坏名称。例
在开始主函数之前,我想看一个全局变量。一种可能的解决方案是创建一个初始化全局变量并在函数上设置断点的函数:
int Init()
{
return 0;
}
int globalX = Init();
//gdb: break Init
//gdb: run
//gdb: awatch globalX
是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前)监视globalX不工作
是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前)
对。但是,GDB将仅在程序
1 2 3 4 5 6 ...
下一页 最后一页 共 37 页