草庐IT

linux - 最小核心转储(堆栈跟踪+仅限当前帧)

我可以在Linux上配置进入核心转储的内容吗?我想获得类似Windows小型转储的信息(应用程序崩溃时有关堆栈帧的最少信息)。我知道您可以使用ulimit为核心文件设置最大大小,但这不允许我控制核心内部的内容(即不能保证如果我将限制设置为64kb它例如,将转储堆栈的最后16页)。此外,如果可能的话,我想以编程方式(通过代码)设置它。我查看了mancore提到的/proc/PID/coredump_filter文件,但对于我的目的来说它似乎过于粗糙。提供一些背景信息:出于多种原因,我需要微型核心文件:我需要通过网络为众多(数千)客户收集它们;此外,这些是带有少量SD卡的嵌入式设备,以及用

linux - at&t汇编中的 'push'和 'pushq'有什么区别

我最近开始寻求更深入地了解我的计算机的工作原理。我的问题是关于push和pushq之间的区别。我知道push向堆栈写入一个值,我的假设是pushq做类似的事情。q在那里的事实让我认为应该存在细微的差异,但我似乎无法理解差异。我声明在使用gdb和命令“layoutasm”调试文件/lib/udev/iphone-set-info时思考这个问题。有问题的代码是:pushq$0x0push%r9我知道$0x0是NULL的十六进制,而%r9是通用寄存器之一。这是否仅仅意味着将Nullus写入堆栈并在其上方写入寄存器%r9? 最佳答案 我不确

linux - at&t汇编中的 'push'和 'pushq'有什么区别

我最近开始寻求更深入地了解我的计算机的工作原理。我的问题是关于push和pushq之间的区别。我知道push向堆栈写入一个值,我的假设是pushq做类似的事情。q在那里的事实让我认为应该存在细微的差异,但我似乎无法理解差异。我声明在使用gdb和命令“layoutasm”调试文件/lib/udev/iphone-set-info时思考这个问题。有问题的代码是:pushq$0x0push%r9我知道$0x0是NULL的十六进制,而%r9是通用寄存器之一。这是否仅仅意味着将Nullus写入堆栈并在其上方写入寄存器%r9? 最佳答案 我不确

c - 进程终止后如何查看堆栈跟踪?

我正在使用gdb命令“附加”来调试进程但是在进程崩溃(sigkill)之后我看不到堆栈跟踪(gdb中的“bt”命令):(gdb)BT没有堆栈。进程终止后如何查看堆栈跟踪? 最佳答案 通过确保ulimit-c不显示核心大小为0,将您的shell设置为转储核心。如果显示为0,则运行ulimit-cunlimited.接下来,重新运行您的程序,直到它崩溃并转储核心,然后调用:gdb/path/to/executable/path/to/core并键入bt以获取堆栈跟踪。此外,您还需要在打开调试信息的情况下编译可执行文件。如果您使用的是gc

c - 进程终止后如何查看堆栈跟踪?

我正在使用gdb命令“附加”来调试进程但是在进程崩溃(sigkill)之后我看不到堆栈跟踪(gdb中的“bt”命令):(gdb)BT没有堆栈。进程终止后如何查看堆栈跟踪? 最佳答案 通过确保ulimit-c不显示核心大小为0,将您的shell设置为转储核心。如果显示为0,则运行ulimit-cunlimited.接下来,重新运行您的程序,直到它崩溃并转储核心,然后调用:gdb/path/to/executable/path/to/core并键入bt以获取堆栈跟踪。此外,您还需要在打开调试信息的情况下编译可执行文件。如果您使用的是gc

linux - 使用远程 gdbserver 启动 ddd

我正在使用ddd调试在远程目标上运行的程序(例如,远程gdbserver通过端口1234在本地主机上运行,​​但仍然充当远程目标)。我知道你可以通过打开ddd连接到gdbserver,然后在ddd的gdb命令行调用targetremotelocalhost:1234,如下所述:http://www.gnu.org/software/ddd/manual/html_mono/ddd.html#Remote%20Program但是,我讨厌每次打开ddd时都必须调用targetremotelocalhost:1234命令,我想将它设置为使用别名自动连接到gdbserver。我尝试运行ddd-

linux - 使用远程 gdbserver 启动 ddd

我正在使用ddd调试在远程目标上运行的程序(例如,远程gdbserver通过端口1234在本地主机上运行,​​但仍然充当远程目标)。我知道你可以通过打开ddd连接到gdbserver,然后在ddd的gdb命令行调用targetremotelocalhost:1234,如下所述:http://www.gnu.org/software/ddd/manual/html_mono/ddd.html#Remote%20Program但是,我讨厌每次打开ddd时都必须调用targetremotelocalhost:1234命令,我想将它设置为使用别名自动连接到gdbserver。我尝试运行ddd-

c - 如何在 gdb 中查看 printf 的输出?

这是我尝试过的,但似乎不起作用:(gdb)callprintf("%d",6)$8=1 最佳答案 你看不到结果是因为stdout(FILE*)有一个输出缓冲区。在缓冲区已满或遇到'\n'之前,它不会向屏幕输出任何内容。这样调用printf:(gdb)call(int)printf("%d\n",6)6$6=2顺便说一句,“$6=2”是printf的结果值。 关于c-如何在gdb中查看printf的输出?,我们在StackOverflow上找到一个类似的问题:

c - 如何在 gdb 中查看 printf 的输出?

这是我尝试过的,但似乎不起作用:(gdb)callprintf("%d",6)$8=1 最佳答案 你看不到结果是因为stdout(FILE*)有一个输出缓冲区。在缓冲区已满或遇到'\n'之前,它不会向屏幕输出任何内容。这样调用printf:(gdb)call(int)printf("%d\n",6)6$6=2顺便说一句,“$6=2”是printf的结果值。 关于c-如何在gdb中查看printf的输出?,我们在StackOverflow上找到一个类似的问题:

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

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