Articles of gdb

如何在使用GDB生成核心转储文件时限制核心转储文件的大小

我正在ARM9主板上运行一个embedded式应用程序,总闪存容量仅为180MB。 我能够运行gdb ,但是当我这样做 (gdb) generate-core-dump 我得到一个错误 warning: Memory read failed for corefile section, 1048576 bytes at 0x4156c000. warning: Memory read failed for corefile section, 1048576 bytes at 0x50c00000. Saved corefile core.5546 The program is running. Quit anyway (and detach it)? (y or n) [answered Y; input not from terminal] Tamper Detected **********OUTSIDE ifelse 0********* length […]

gdb如何获取线程名称显示

在我的应用程序中创build了很multithreading。 一些线程名在gdb中可见,而我执行命令'info threads',其他的则不显示。 如何获取所有的线程名称本身,而不是hex值,如0xb7fe1424 4 Thread 0xb68ffb70 (LWP 18377) 0xb7fe1424 in __kernel_vsyscall () * 3 Thread 0xb7291b70 (LWP 18375) JKMainT (arg=0x0) at mylib.cpp:482 2 Thread 0xb7a92b70 (LWP 18374) 0xb7fe1424 in __kernel_vsyscall () 1 Thread 0xb7a94730 (LWP 18371) 0xb7fe1424 in __kernel_vsyscall ()

为什么我不能在gdb中打印出环境variables?

#include <unistd.h> #include <stdio.h> extern char **environ; int main(int argc, char *argv[]) { int i = 0; while(environ[i]) { printf("%s\n", environ[i++]); } return 0; } 这是我的操作: (gdb) n 8 printf("%s\n", environ[i++]); (gdb) p environ[i] Cannot access memory at address 0x0 (gdb) n LOGNAME=root 7 while(environ[i]) { 正如你所看到的, printf可以打印出environ[i] ,但是p environ[i]给我Cannot access memory at address 0x0 […]

如何访问.gdbinit和gdb内部的环境variables?

我在用gdb进行debugging时,正在设置源代码的path。 我select用.gdbinit文件来做到这一点。 基本上它包含一个命令: directory="/path/to/src". 不过,我希望能够指定该命令为: directory="$SOURCESROOT/src" SOURCESROOT是一个环境variables。 而且,如果可能的话,也可以在gdb的debuuging会话中通过inputdirectory=$SOURCESROOT/folder来做到这一点。 基本上,我正在寻找访问内部gdb(或内部.gdbinit)的环境variables。 但不是恶魔的环境(设置env等),而是gdb本身的环境(即我在第一个input“gdb程序”的bash提示符处)。 在gdb会话中inputshell $SOURCESROOT显示环境variables的内容时,这是无用的,因为我不能input: directory=shell $SOURCESROOT 。 PS:任何人都会发现Linux(Debian)的理想设置是使用“apt-get source”来下载源代码,并使用某种“apt-get update”utopic命令更新这些源代码并安装它们,以便gdb自动查找来源?

使成功终止gdb自动退出?

我使用一个debugging脚本连续运行几个相关的进程与debugging器。 我目前使用-x自动执行几个命令(如run )。 如何在debugging过程成功终止时自动退出gdb? 向命令文件添加一个quit命令将导致该命令不仅在成功终止时被处理,而且还会在发生错误时(当时我宁愿接pipe)。 以下是正在发生的事情摘录: + gdb -return-child-result -x gdbbatch –args ./mkfs.cpfs / dev / loop0 GNU gdb(GDB)7.1-ubuntu 读取/home/matt/cpfs/mkfs.cpfs…done中的符号。 程序正常退出。 断点2在0x805224f:文件log.c,第32行。 (GDB) gdbbatch内容: 开始 b cpfs_log如果级别> =警告

gdb – 列出当前函数的来源而不input其名称

在GDB中,命令: list function 将列出该function的所有来源。 是否有一个命令会列出当前所有函数的源代码,而不需要手动input函数名称?

Linux C:类似shell的环境 – 个别执行 – C命令? (C口译员)

对不起,如果这个问题措辞错误 – 我不知道我要求的正确的话! 🙂 说,你有一些简单的C程序,如: #include <stdio.h> int main() { int a=2; printf("Hello World %d\n", a); return 0; } 通常情况下,这将不得不被保存在一个文件(比如, hello.c ); 那么我们在源文件上运行gcc并获得可执行文件 – 如果我们编译了debugging信息,那么我们可以在可执行文件上使用gdb来遍历代码行,并检查variables。 我想要的是基本上某种“C”shell – 类似于Pythonshell; 从某种意义上说,我可以在一个文件(一个脚本)中拥有一系列Python命令 – 或者我可以将相同的命令粘贴到shell中,并执行相同的命令。 关于上面这个简单的程序,这是我希望能够做到的( C>代表想象中的提示): C> #include <stdio.h> (stdio.h included) C> int a=2; C> printf("Hello World %d\n", a); Hello World 2 C> 换句话说,我希望能够交互地执行单个C命令( 我猜这会代表即时编译的sorting? )。 最初,我被C shell […]

返回到libc在gdb中工作,但不是在单独运行时

我正在尝试使用以下简单代码返回到libc技巧: #define SYSTEM_CALL_ADDR 0xb7ec5e50 /*my system call addr*/ #define EXIT_CALL_ADDR 0xb7ebbb80 /*my exit call addr*/ char shell[] = "/bin/sh"; int main(){ int* p; p = (int*)&p + 2; *p = SYSTEM_CALL_ADDR; p = (int*)&p + 3; *p = EXIT_CALL_ADDR; p = (int*)&p + 4; *p = shell; return 1; } 有趣的是,当我运行这个程序时,它以“分段错误”结束,但如果我使用gdb进行debugging并逐步运行,那就完全正常了,产生一个shell然后退出程序。 有人遇到这种情况? 或者有人请指导我如何纠正这一点? 首先感谢。 我在ArchLinux内核上:2.6.33,gcc […]

读取GDB寄存器指向的内存

如果知道内存位置,有没有办法从GDB查看内存内容? 那是我正在debugging我为我的操作系统课程编写的x86汇编程序。 我正在尝试做的是用C和gas(GNU汇编器)在x86上编写用于Linux的用户级线程库。 我分配了自己的堆栈,并将esp寄存器指向了该内存位置。 现在我想要做的是读取内存,看看我分配的堆栈里有什么。

如何运行GDB,在命令行中input文本并查看可执行文件如何处理这些条目?

如何运行GDB同时允许从命令行交互input字符,同时“打印”来自这些条目的分析字符的variables值? 换句话说,我该如何运行gdb,在命令行中input文本并查看可执行文件如何处理这些条目? 如果我使用Mx gdb从Emacs中运行它,那么gdb的行为还有什么区别吗? 用Cc Cc暂停可执行文件,然后尝试打印variables值的行为不像我预期的那样。 它似乎没有识别被debugging的暂停可执行文件的有效variables值。 我用-ggdb -O0标志生成了一个来自Clang可debugging的可debugging代码。 我也尝试将gdb链接到在单独的terminal中运行的程序可执行文件的pid,但仍然有困难。 程序需要交互地parsing命令行条目; 我不能把它们作为最初的命令行参数。 我希望我明确提出我的问题。