Articles of gdb

与GDB远程debugging错误

我试图远程debuggingx86_64 suse linux上的32位应用程序,但得到这个“远程寄存器格式错误”的错误。 我启动gdbserver侦听端口12345(gdbserver localhost:12345 my_prog) 这是错误的: $ gdb GNU gdb 6.6 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely […]

GDB没有这样的文件或目录

我正在关注OpenSecurityTraining的这些经验教训。 我已经到了实验室,在那里我要用CMU炸弹训练自己。 他们提供了一个x86_64编译的CMU炸弹,你可以在这里find: CMU炸弹x86-64最初来自CMU实验室计算机系统:程序员的视angular(CS:APP)第一版 32位炸弹。 我有一个虚拟化的64位基本操作系统发行版,我可以毫不费力的使用GDB反汇编CMU Bomb。 现在,我有一个64位的Ubuntu 14.04 LTS(未虚拟化),当我试图重现为什么我做了我的基本操作系统,我得到了着名的错误。 我运行这些命令: gdb ./bomb-x64 (gdb) b main Breakpoint 1 at 0x400dbd: file bomb.c, line 37. — why bomb.c ? (gdb) r … bomb.c: no such file or directory 编辑:我可以在CMU炸弹的其他function上创build断点,并按预期工作。 例如: (gdb) b phase_1 Breakpoint 3 at 0x400f00 (gdb) r Breakpoint 1, 0x0000000000400f00 in phase_1 () (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 […]