Articles of gdb

内核模块找不到debugging符号

我加载linux内核模块后 user@c4:$ insmod mmaptest.ko 我可以validation它是通过加载 user@c4:$ cat /proc/modules mmaptest 12727 0 – Live 0x0000000000000000 (OF) 但是所有段都以0x00地址列出。 user@c4$:$ systool -vm mmaptest Module = "mmaptest" Attributes: coresize = "12727" initsize = "0" initstate = "live" refcnt = "0" srcversion = "EABEF6F90BEAAD0D15B576A" taint = "OF" uevent = <store method only> Parameters: count = "0" Sections: .bss = "0x0000000000000000" […]

gdb / ddd编程接收信号SIGILL

我在Linux中使用c ++编写了一个非常简单的程序,它使用cURL库从http下载某个网站的图像(基本上开发了一个http客户机请求)。 http://curl.haxx.se/libcurl/c/allfuncs.html #define CURL_STATICLIB #include <stdio.h> #include <stdlib.h> #include </usr/include/curl/curl.h> #include </usr/include/curl/stdcheaders.h> #include </usr/include/curl/easy.h> size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written = fwrite(ptr, size, nmemb, stream); return written; } int main(void) { CURL *curl; FILE *fp; CURLcode res; char *url = "http://img.zgserver.com/linux/test_img.png"; char outfilename[FILENAME_MAX] = "/home/c++_proj/output/web_req_img.png"; curl = curl_easy_init(); […]

如何从包含子目录的给定pathrecursion加载所有符号文件?

您可以使用以下命令将单个符号文件指向gdb: symbol-file /usr/lib/debug/symbolfile.so 但如何告诉gdb从给定的path包括子目录加载所有符号文件?

无法为我的崩溃的程序创build一个核心文件

我正在使用Ubuntu 12.04 LTS。 我写了一个简单的程序如下创build崩溃 // null.c #include<stdio.h> int main() { int *p = NULL; int k=*p; printf("%d",sizeof(0)); return 0; } 现在我运行“gcc -g null.c”,然后是“./a.out”,输出如预期。 Segmentation fault (core dumped) 现在我想看看使用gdb的核心转储文件。 我做了以下的事情 我检查了当前目录,没有核心转储文件 我试图用内核“core.%e。%p”来改变/ proc / sys / kernel / core_pattern。 但是我无法写入文件。 这是说“Fsync失败”。 我使用了“sudo vi / proc / sys / kernel / core_pattern”。 仍然无法写入文件。 我想在我的当前目录中创build核心转储。 现在做什么?

gdb将内存地址解释为对象

我正在调查基于可用核心转储的崩溃。 应用程序崩溃是一个C ++程序,使用gcc构build,并在RH5上运行。 回溯似乎有效,直到#1帧。 在那里试图打印一个对象,我得到<invalid address>, <error reading variable>因为我有#2帧的对象的地址是一个有效的推测,我可以以某种方式'转储'的对象是分配和仍收集一些信息。 此外,不要试图猜测对象如何alignment,我可以强制gdb打印地址,就好像它是一个对象,即使它检测到一些错误。 我的想法是,也许对象已被删除,但只是也许内存仍然在那里,我可以打印一些成员variables。 请评论是可能的,如果是这样的话,应该如何用gdb来完成。 10X。

缓冲区溢出在64位

我正在试图用缓冲区溢出做一些有趣的实验。 我正在阅读这个论坛的主题,并试图写我自己的小代码。 所以我做的是一个小的“C”程序,它需要字符参数并运行,直到分段错误。 所以我提供的参数,直到我得到一个消息,我用41代替了返回地址。我的缓冲区字符长度,我复制我的inputstring是[5]。 这是我在gdb中做的。 run $(perl -e 'print "A"x32 ; ') Program received signal SIGSEGV, Segmentation fault. 0x0000000000400516 in main (argc=Cannot access memory at address 0x414141414141412d 然后我发现需要16个'A'来覆盖。 run $(perl -e 'print "A"x16 . "C"x8 . "B"x32 ; ') 0x0000000000400516 in main (argc=Cannot access memory at address 0x434343434343432f ) 这告诉我们8“C”正在覆盖返回地址。 根据在线教程,如果我提供了一个有效的地址,而不是8“C”。 我可以跳到某个地方并执行代码。 所以我在初始的16“A”之后超载了内存。 下一步是执行 run […]

如何逐行运行Linux程序

我想用一些debugging器逐行运行一个GTK + / C程序。 我从来没有debugging过一个Linux程序,所以在哪里可以find一个非常初学者如何debugging代码的说明? 我只是有一个想法,我必须从网上下载源代码,用debugging符号编译项目,并通过DDD或GDB运行源代码。 那么任何人都可以提出如何开始学习这些主题的build议,并且开始一个好的debugging器是什么? 我至less有时间学习东西。

什么是“mov rax,QWORD PTR fs:0x28”汇编指令呢?

在执行该指令之前,fs包含0x0。 另外我想知道我怎么能从GDB的这个内存区读取,这个命令是什么?

GDB回溯没有用户input?

我想知道是否可以通过GDB启动应用程序,在SegFault上将回溯写入文件(稍后查看),然后在没有任何用户input的情况下退出GDB。 我正在从一个非交互式会话的操作系统启动一个无限循环的shell脚本运行一个应用程序(所以如果它崩溃它重新加载)。 该应用程序崩溃在一个不可重现的方式,所以我需要从崩溃的回溯debugging问题。 理想情况下,我只是修改shell脚本以包含GDBdebugging+回溯function,并保留应用程序崩溃后的自动重新启动。 这可能吗?

步入共享库的条件应该在gdb中工作?

有很多与特定错误相关的问题,为什么用gdb进入共享库不起作用。 他们都没有提供有关如何确定原因的系统答案。 这个问题是关于如何诊断设置。 设置示例 main.c中 #include <stdio.h> #include "myshared.h" int main(void) { int a = 3; print_from_lib(); return 0; } myshared.h void print_from_lib(); myshared.c #include <stdio.h> void print_from_lib() { printf("Printed from shared library\n"); } 将所有文件放在同一个目录中。 export LIBRARY_PATH=$PWD:$LIBRARY_PATH export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH gcc -ggdb -c -Wall -Werror -fpic myshared.c -o myshared-ggdb.o gcc -ggdb -shared -o libmyshared-ggdb.so myshared-ggdb.o gcc […]