草庐IT

linux - gdb如何从脚本执行目标程序

我想调试一个程序,使用gdb。但我通过脚本调用该程序。如何使用gdb?脚本很长,我无法使用gdb的命令行参数直接调用程序。脚本启动时创建的进程也很短暂,因此无法将gdb附加到进程。我想做的是,用那个程序启动gdb,然后添加我的断点执行脚本(仅供引用-它也接受参数),然后当它遇到断点时做任何我想做的事。我查看了gdb中的shell选项,但如果我没记错的话它会生成一个新的shell,并在完成后返回到gdb。这不是我想要的。如果有更好的方法请告诉我。 最佳答案 有几种方法。真正老派的方法是在程序的main中加入一个循环,例如:volati

linux - 使用 GDB 生成核心转储文件时如何限制其大小

我在ARM9板上运行嵌入式应用程序,总闪存大小仅为180MB。我能够运行gdb,但是当我运行时(gdb)生成核心转储我得到一个错误warning:Memoryreadfailedforcorefilesection,1048576bytesat0x4156c000.warning:Memoryreadfailedforcorefilesection,1048576bytesat0x50c00000.Savedcorefilecore.5546Theprogramisrunning.Quitanyway(anddetachit)?(yorn)[answeredY;inputnotfrom

linux - 使用 GDB 生成核心转储文件时如何限制其大小

我在ARM9板上运行嵌入式应用程序,总闪存大小仅为180MB。我能够运行gdb,但是当我运行时(gdb)生成核心转储我得到一个错误warning:Memoryreadfailedforcorefilesection,1048576bytesat0x4156c000.warning:Memoryreadfailedforcorefilesection,1048576bytesat0x50c00000.Savedcorefilecore.5546Theprogramisrunning.Quitanyway(anddetachit)?(yorn)[answeredY;inputnotfrom

c - gdb 查找行号的内存地址

假设我已经将gdb附加到一个进程,并且在它的内存布局中有一个文件和行号,我想要它的内存地址。如何获取文件x中第n行的内存地址?这是在Linuxx86上。 最佳答案 (gdb)infolinetest.c:56Line56of"test.c"startsataddress0x4005aeandendsat0x4005ba.此外,对于python,您可以使用来自Symbol-Tables-In-Python这目前需要来自cvs的最新版本的gdb,但我想将在7.5中普遍可用(gdb)pyx=gdb.find_pc_line(gdb.dec

c - gdb 查找行号的内存地址

假设我已经将gdb附加到一个进程,并且在它的内存布局中有一个文件和行号,我想要它的内存地址。如何获取文件x中第n行的内存地址?这是在Linuxx86上。 最佳答案 (gdb)infolinetest.c:56Line56of"test.c"startsataddress0x4005aeandendsat0x4005ba.此外,对于python,您可以使用来自Symbol-Tables-In-Python这目前需要来自cvs的最新版本的gdb,但我想将在7.5中普遍可用(gdb)pyx=gdb.find_pc_line(gdb.dec

c - 为什么我不能在 gdb 中打印出环境变量?

#include#includeexternchar**environ;intmain(intargc,char*argv[]){inti=0;while(environ[i]){printf("%s\n",environ[i++]);}return0;}这是我的操作:(gdb)n8printf("%s\n",environ[i++]);(gdb)penviron[i]Cannotaccessmemoryataddress0x0(gdb)nLOGNAME=root7while(environ[i]){如你所见,printf可以打印出environ[i],但是penviron[i]给我不

c - 为什么我不能在 gdb 中打印出环境变量?

#include#includeexternchar**environ;intmain(intargc,char*argv[]){inti=0;while(environ[i]){printf("%s\n",environ[i++]);}return0;}这是我的操作:(gdb)n8printf("%s\n",environ[i++]);(gdb)penviron[i]Cannotaccessmemoryataddress0x0(gdb)nLOGNAME=root7while(environ[i]){如你所见,printf可以打印出environ[i],但是penviron[i]给我不

c++ - 如何使用 SIGSEGV 的信号处理程序调试程序

我正在为应用程序编写插件,偶尔会抛出一个SIGSEGV。但是,应用程序捕获信号SIGSEGV。换句话说,插件是一个动态库。错误发生在我的插件和动态库中。但应用程序处理sSIGSEGV并正常退出。因此,我很难调试并获取所有堆栈帧的回溯。任何想法?目前我使用gdb作为调试工具。 最佳答案 GDB将在应用程序之前捕获SIGSEGV。您在对Logan的回答的评论中描述的内容毫无意义。我怀疑真正发生的事情是应用程序创建了一个新进程,并且只在另一个进程中获取SIGSEGV,而不是您将GDB附加到的进程。如果我的猜测是正确的,下面的命令可能会有用

c++ - 如何使用 SIGSEGV 的信号处理程序调试程序

我正在为应用程序编写插件,偶尔会抛出一个SIGSEGV。但是,应用程序捕获信号SIGSEGV。换句话说,插件是一个动态库。错误发生在我的插件和动态库中。但应用程序处理sSIGSEGV并正常退出。因此,我很难调试并获取所有堆栈帧的回溯。任何想法?目前我使用gdb作为调试工具。 最佳答案 GDB将在应用程序之前捕获SIGSEGV。您在对Logan的回答的评论中描述的内容毫无意义。我怀疑真正发生的事情是应用程序创建了一个新进程,并且只在另一个进程中获取SIGSEGV,而不是您将GDB附加到的进程。如果我的猜测是正确的,下面的命令可能会有用

gdb可以自动在SIGSEGV上附加一个进程吗

我有一个错误的程序,当执行时收到一个SIGSEGV。我可以像这样使用gdb:$gdb./prog但我更希望gdb从prog捕获SIGSEGV并自动附加它。$./progSegmentationFault(gdb)...有办法吗?谢谢 最佳答案 嗯。您可以设置信号处理程序以使用当前进程启动调试器。这样您就可以“实时”检查整个状态。#include#include#include#includeconstchar*prog=0;voidfn(intsignum){charbuf[256];snprintf(buf,255,"ddd%s%