Articles of gdb

printf()似乎在破坏我的数据

我在C编写一个nginx模块,并有一些超级离奇的结果。 我从我的模块中提取了一个函数来testing它的输出以及相关的nginxtypes/macros定义。 我在我的build_key_hash_pair函数中构build一个结构,然后在printf()的内容上执行printf() 。 当我printf内部printf的数据时, main的输出是有效的。 当我在内部函数中删除printf , main打印一个空string。 这是令人困惑的,因为在函数调用build_key_hash_pair我不对数据进行操作,除了显示它。 这里是代码: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ngx_str_t { size_t len; char *data; } ngx_str_t; typedef uintptr_t ngx_uint_t; typedef struct key_hash_pair { ngx_uint_t hash; ngx_str_t key; } key_hash_pair; #define ngx_string(str) { sizeof(str) – 1, (char *) str } #define ngx_str_set(str, text) \ (str)->len […]

在Qtcreator中debugging助手不能在Linux上工作

对不起英文。 理论上,在qt-creator中debugging时显示Qt中定义的类的字段。 但它不这样做,只显示或内存地址。 我认为在GDB或Python脚本的问题。 从http://origin.releases.qt-project.org/gdb/加载的GDB给出了上面描述的内容。 我试图用configuration标志自己构buildGDB configure –prefix=<DIR> –target x86_64-linux-gnu –with-python 和 configure –target x86_64-linux-gnu –disable-nls –with-libiconv –with-expat –with-python 但是从Qtcreator开始的时候却崩溃了 我在Ubuntu 12.10 x64上运行Qt版本是4.8.4(来自Git),创build者是2.5.2(来自qt-project站点)和2.6.81(git)GDB版本:构build自己 – 7.5从qt-project下载 – 7.4.1 在Win8的主题工作正常,结合QtCreator(2.6.81)-Qt-4.8.4-MinGW-GDB-7.5(用Py。支持从源码构build自己) UPD:尝试用http://qt.gitorious.org/qt-creator/qt-creator/trees/master/dist/gdbbuild立它并没有帮助 解决scheme:Qt库不包含debuggingsimbols。 我被国旗揪住了。 它在macOS和windows(MinGW)中工作,但不在Linux中。 小心!

自动打印GDB中最后一个expression式的值,如VisualStudio的“自动”观察窗口

VisualStudio的debugging器有一个称为自动窗口的function,它总是显示当前和以前的expression式的值。 有没有办法在GDB中实现类似的行为,特别是对于C ++应用程序? 我知道GDB中的display和commands命令,但它们似乎并不是我正在寻找的。 在VS中,debugging器会自动计算出要评估哪个expression式,然后通过程序的每一步对其进行评估。 这个function – 自动找出要评估的expression式 – 是我想让GDB做的事情。 例如,假设我正在执行此代码: #include <cstdlib> #include <iostream> #include <iomanip> #include <sstream> using namespace std; int main() { string s = "Hello"; s += "World"; int i = 2; i *= 3; i *= 7; stringstream ss ; ss << "The result is " << i << "!\n"; […]

如何在创build新线程时阻止程序执行? (与GDB)

EX:线程A创build线程B.我想阻塞线程A,当它开始创build线程B,但我不知道如何使用GDB。 任何帮助将不胜感激!谢谢

gdb tracepoint的操作不起作用

跟踪点可以跟踪,但跟踪操作不能正常工作。 在gdb的最后一侧显示跟踪点被跟踪。 但“收取$ regs”不能按预期工作。 我的平台是RH6.4。 1.gdbserver端。 gdbserver :10000 ./a.out Process ./a.out created; pid = 10466 Listening on port 10000 Remote debugging from host 127.0.0.1 2. gdb方。 gdb a.out (gdb) target remote :10000 Remote debugging using :10000 Reading symbols from /lib64/ld-linux-x86-64.so.2…(no debugging symbols found)…done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 0x00000033b7000b00 in _start () from /lib64/ld-linux-x86-64.so.2 Created trace […]

用gdbdebuggingc程序来显示hex地址

我有一个关于debuggingc代码的问题。我做了研究,但是不能满足我。 我知道下面的命令: (gdb) x/x 'address' #show hexadecimal address (gdb) x/100s 'address' #show next 100 decimals (gdb) x/10b 0x0804846c-10 #show byte at 0x0804846c-10 (gdb) x/10b 0x0804846c+20 #show byte at 0x0804846c+20 (gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c (gdb) x/10x $esp #show next 10 addresses at esp register 但是我想知道x/10x $esp – 50到底做了什么? 我拿到了吗? 这是对的吗? “在$ esp之前显示50个地址后,最多可达10个地址”如果你完全告诉我纠正我,我会感激的…… […]

使用GCC和GDB的Ubuntu上的QT Creator – debuggingC ++ – 更详细的分段错误消息

我在Linux上工作比较新,所以我可能会忽略一些简单的东西。 在Windows上,如果我的程序导致分段错误,我已经习惯了一些有用的信息popup。 有什么影响: Access violation reading/writing/executing memory at address 0x**** , Stack overflow等 在通过QT Creator进行Linuxdebugging时,我所得到的是: The inferior stopped because it received a signal from the Operating System. Signal name : SIGSEGV Signal meaning : Segmentation fault 有没有办法让这些消息给出相同的信息,在他们的Windows相对应,或至less是故障的types(内存违规,堆栈溢出等)? 我当然可以使用GDB来debugging程序,但是这个popup窗口通常会让我很快了解问题所在,而不是在崩溃站点周围进行挖掘。

以控制台模式更改/过滤GDB输出

我在预configuration的环境中从控制台使用GDB,它提供的版本有一些错误。 最烦人的是,有时在进入函数或添加断点或打印调用堆栈时,会喷出数百个与此类似的连续行: warning: Range for type (null) has invalid bounds 0..-103 我可以find这个问题的唯一参考,这是没有用的。 鉴于上述,我认为这应该是简单的 指示GDB抑制这种警告 – 看起来像死胡同。 据我所知,GDB不允许用户压制这样的警告。 通过.gdbinit拦截他们 – 似乎很有希望。 我能够改变terminal的颜色,例如,通过戳穿这个答案中引用的.gdbinit文件。 不幸的是,我找不到任何对我的目的有用的文档 。 过滤警告(也许通过stdout和GDB之间的某种代理) – 感觉hackish,但我不介意这样做,如果它能以某种方式工作。 一个愚蠢的尝试是将stderrredirect到/dev/null如下所示: gdb -p xxxxxx 2> /dev/null ,但看起来好像是警告实际上被推送到stdout。 游民。 然后我也想,也许我可以做一些愚蠢的事情,如通过grep过滤stdout像这样gdb -p xxxxxx | grep -v ^warning gdb -p xxxxxx | grep -v ^warning ,但是这似乎具有使terminal提示因某些原因不可见的副作用。 有没有人有一些想法可以工作? 我search了很多东西,可能会帮助我实现第三个想法,但到目前为止,我空手而出…

gdb:检查堆栈和小端澄清

我正在研究一个程序的内存布局。 我正在使用gdb来检查一个小端(intel x86_64)Linux(32位)机器中的堆栈。 但是,我不能理解这个处理器和gdb的大端和小端的概念。 我的示例程序是: 1 #include<stdio.h> 2 3 int main(int argc, char **argv) { 4 int a = 5; 5 char b[] = "ABCDEFGH"; 6 7 return 0; 8 } [Code – 1] 以下指令序列在gdb中执行。 (gdb) b 7 Breakpoint 1 at 0x8048434: file args.c, line 7. (gdb) r Breakpoint 1, main (argc=1, argv=0xbffff4f4) at args.c:7 […]

将GDB附加到Linux中正在死亡的进程中

我想将gdb附加到一个正在死亡的进程中,因为程序在生产环境中运行,我需要在那里debugging它,如果我使用gdb打开程序,速度会变慢,而且计算机也不是那么好。 我试图在应用程序中捕获信号,并在那里附加gdb,但是如果我自己发送信号,它就会起作用。 当程序停滞时(multithreading程序,主线程发生死锁或者卡住(或者显然卡住了)),并且用户强制它在桌面环境(LXDE)中退出,我不能捕捉到任何信号。 该程序是PySide的graphics界面的所有python。 只关心linux。 我的想法是创build一个内核驱动程序,并尝试过程终止或信号发送在那里,但因为这将是一个麻烦,我想问是否有一些工具,这种事情或一些信息,我可以做用于。 谢谢。