草庐IT

c++ - 如何使用 gdb 找到全局变量的析构函数调用?

我们有一个非常大的项目。(大约200'000个文件)当项目退出时,它在全局变量的解构中崩溃。但是我们找不到变量定义的地方。有人知道如何找到全局变量在哪里吗? 最佳答案 Butwecan'tfindwherethevariabledefined.大概,您想找出哪个全局变量导致了问题。如果你知道它是哪一个,你可以使用grep,或GDBinfovariablefoobar找到它。让我们考虑一个例子。catfoo.cc#include#includeusingstd::string;stringfoo("foo");stringbar("b

c++ - 在 gdb 中为 linux 启用 memleak 选项

我正在尝试查看导致内存泄漏的进程,并转储导致它的堆以查看问题所在。我在gdb中使用哪个命令来设置内存泄漏并检查堆?我试过:(gdb)check-leakscheckpoint:can'tfindforkfunctionininferior.(gdb)helpinfoheapUndefinedinfocommand:"heap".Try"helpinfo".(gdb)helpinfoleaksUndefinedinfocommand:"leaks".Try"helpinfo". 最佳答案 正如人们指出的那样,Valgrind是您的答案

linux - GDB 核心转储 : Find executable by build-id

有没有可能让gdb自动找到对应的可执行文件?我提取了调试符号并将它们放在/usr/lib/debug/.build-id/目录中。当我使用gdb/usr/bin/executablecore启动gdb时,一切正常。可执行文件和所有共享库的所有调试符号都会自动加载,因为gdb知道构建ID并自动加载它。$gdb/usr/bin/executablecoreGNUgdb(GDB)7.0.1-debianCopyright(C)2009FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlaterThisisfreesoftware

linux - 如何在 Linux 上使用核心转储和 gdb 使用一个近似虚拟内存 (VSZ)?

我正在编写一个用于核心转储分析的工具,我想打印的一件事是估计转储时进程使用了​​多少虚拟内存。这些核心转储可能是由于崩溃造成的,也可能是使用gcore手动获取的(例如,用于调整大小)。本质上,我想打印PSVSZ列的等效项。我研究了readelf和gdb,并专注于后者。例如,我有一个简单的程序挂起,我在PS中看到:$psauxwww|grepa.outUSERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMANDroot166440.00.04108472pts/5S+13:510:00./a.out我使用gcore获取一个核心,此时它使用4,206,592字节

c - 段错误仅出现在 GDB 中

为什么下面的程序在执行时没有崩溃,而是在GDB中出现segfault而崩溃?在32位x86(Athlon64,如果重要的话)上使用GCC4.5.2编译。#include#includeintmodify(void){__asm__("mov$0x41414141,%edx");//Strayvalue.__asm__("mov$0xbffff2d4,%eax");//Addr.ofretpointerforfunction().__asm__("mov%edx,(%eax)");}intfunction(void){modify();return0;}intmain(intargc,c

c++ - 为什么 gdb 不适用于这个简单的 hello world 程序?

代码(m1.cpp):#includeusingnamespacestd;intmain(intargc,char*argv[]){coutGDB版本:GNUgdb(GDB)7.6.2构建使用:g++-gm1.cpp命令行历史:(gdb)bmainBreakpoint1at0x40087b:filem1.cpp,line6.(gdb)rStartingprogram:.../a.outProgramreceivedsignalSIGSEGV,Segmentationfault.0x00002aaaaaac16a0instrcmp()from/lib64/ld-linux-x86-64.

c - 为什么 syslog 和 gdb 对同一个共享库显示不同的加载地址?

我遇到了段错误。系统日志报告以下内容:segfaultat0ip00000000f71ff256sp00000000f44fee50error4inlibprotobuf-c.so.0.0.0[f71f8000+f000]因此,libprotobuf-c.so被加载到0xf71f8000。当我在gdb中加载相应的核心文件并尝试infosharedlibrary时,它显示FROM地址为0xf71f9f70,这与syslog显示的不同。我无法理解这种不匹配。有人可以帮忙吗?0xf71f9f700xf7204028Yes(*)/usr/lib/libprotobuf-c.so.0

linux - 如何使用gdb在linux下调试用fasm编写的程序?

我在fasm及其工作中编写了简单的“hello,world”,但如何为gdb和edb(Evan的调试器)生成调试信息?Fasm编译器只能生成其特定格式的调试符号-“fas”,这当然是gbd无法理解的。 最佳答案 暂时不可能。GDB不理解.fas格式,因此您首先需要将.fas文件转换为DWARF,但不存在这样的转换器。Tomasz有askedforhelp使用格式转换器,所以如果您觉得自己可以胜任这项任务,您应该试一试。 关于linux-如何使用gdb在linux下调试用fasm编写的程序

linux - GDB 使用 clone() 调试应用程序

是否有GDB的GUI允许我调试使用clone()系统调用创建线程的应用程序?我尝试了Insight和KDBG,但由于某种原因,当创建新的克隆线程时,我在线程列表中看不到它。克隆系统调用通过内联汇编调用。是不是因为创建的线程和原来的进程共享PID?(虽然它有一个唯一的TID) 最佳答案 你试过吗:setfollow-fork-modechild我不使用gdbGUI。有时gdb-tui如果我觉得轻浮。 关于linux-GDB使用clone()调试应用程序,我们在StackOverflow上找

c - GDB 在调试快速 fork 并执行另一个程序的多线程程序时崩溃

我正在使用GDB调试我的C程序,它有点不稳定,可能是因为我没有使用glibc,所以它在中断之前不会检测到新线程。我通过添加一个立即恢复的断点(如果为0则中断)来修复此问题。然而今天我撞墙了。我需要非常快的执行execve()所以正常的fork()是不可能的(会使用大量内存)而且我不能vfork()(我需要一个堆栈来设置管道等)所以我使用与该库(https://code.google.com/p/popen-noshell/)中相同的方法,基本上只使用CLONE_VM进行克隆。这(或者一般调用execve()-我真的不知道)让GDB出于某种原因真的很困惑-基本上它输出这样的东西:[New