Articles of gdb

Arch Linux gdb立即崩溃

我最近在我的archlinux系统上安装了gdb,并且随时使用gdb,它立即崩溃,并显示以下消息: 在开机之前不要抓到: 扔到钥匙 打印exception时出错: 键: 无法打印exception。 中止。 当我说“使用它”时,我的意思是任何东西。 input“gdb”本身导致这个,input“gdb -help”导致它,inputgdb命令的所有结果都是这个错误。 任何想法,我应该看看纠正它?

如何自动重新连接到由gdb内的valgrind控制的进程?

我做了一个很难debugging的内存错误,在每次命令行运行中每一次都发生一次,每次大概需要两个小时才能完成。 因此,我认为创build这样的日志可能是一个好主意: while true; do valgrind ./command 2>&1 | tee command grep -q Invalid && break done 问题是我的debugging日志和由Valgrind生成的堆栈跟踪是不够的,所以我决定添加–vgdb-error=0到命令行。 不幸的是,由于Valgrind现在在启动时添加了一个断点,我需要运行以下命令: $ gdb ./command …gdb init string follows… (gdb) target remote | /usr/lib/valgrind/../../bin/vgdb Remote debugging using | /usr/lib/valgrind/../../bin/vgdb relaying data between gdb and process 4361 Reading symbols from /lib/ld-linux.so.2…(no debugging symbols found)…done. Loaded symbols for /lib/ld-linux.so.2 [Switching […]

在GDB中删除用户定义的命令

我在GDB中创build了几个钩子和用户定义的命令。 现在我只想知道如何删除或更改它们。 谢谢,

在gdb中运行时,dlopen会导致段错误

我的项目在主线程中用dlopendynamic加载一个libray(在debugging模式下编译),然后使用dlsym没有问题。 但是,当在gdb 7.7.1 + dfsg-5的debugging模式下运行时,它会崩溃。 我从内核日志中看到这个错误: gdb[8814]: segfault at 7fff4e019fa0 ip 0000000000718b95 sp 00007fff4e019f90 error 6 in gdb[400000+574000 这导致我无法使用debugging器。 可怕! 我能做些什么来解决这个问题? 我的项目有这个复杂的结构。 我知道它有罕见的结构,但我被告知要使用外部库。 MAIN RUNNABLE (compiled with S1.so) | – SHARED_1 (S1.so) (compiled with s1.a, s2.a, s3.a) | – STATIC_1 (s1.a) | – dlopen S2.so and call functions from S2.so | – STATIC_2 (s2.a) | […]

Linux,如何在GDB中运行c代码之前等待几秒钟

我正在使用以下命令加载c文件程序,并在terminal中通过一次单击在GDB中运行它: gdb –eval-command='file c.out' –eval-command='c' 加载程序之后,我想睡几秒钟,但在GDB启动程序之前,有些事情是这样的: gdb –eval-command='file c.out' –eval-command='<sleep 5>' –eval-command='c'

使用GDB将运行的进程STDOUT / STDERRredirect到SSH STDOUT

我有一个在embedded式系统上运行的进程(linux)。 它的STDOUT / STDERR是串口上的控制台。 我想将其输出(标准和错误)redirect到SSH会话的输出。 我读过你可以用GDB做类似的操作,但是我不知道如何redirect到SSH会话的STDOUT / STDERR而不是文件。 由于磁盘资源不足,我无法对文件执行此操作。 我也看到了一些使用命名pipe道的例子,但是我没有mkfifo命令可用。 我有GDB。 另外,假设这是可能的,当我closuresSSH会话时,进程是否会终止? 如果是这样,我可以重新导向回来吗? 谢谢。

ps -ef在Asterisk重启时崩溃

如果我重新启动Asterisk,在/ tmp目录中将出现大约10个核心转储,所有这些转储都有相同的崩溃。 手动执行ps -ef不会导致崩溃。 gdb输出: Core was generated by `ps -ef'. Program terminated with signal 11, Segmentation fault. #0 reset_global () at ps/global.c:362 362 look_up_our_self(&p); (gdb) Disassmble: 0x0000000000403040 <+0>: push %rbp 0x0000000000403041 <+1>: mov $0xdeadbeef,%eax 0x0000000000403046 <+6>: push %rbx 0x0000000000403047 <+7>: sub $0x80028,%rsp 0x000000000040304e <+14>: mov 0x21147b(%rip),%rbx # 0x6144d0 <selection_list> 0x0000000000403055 <+21>: cmp %rax,%rbx 0x0000000000403058 […]

为什么“pstack”只打印一个线程的内容?

我的OS是RHEL 7 ,我运行一个简单的Go程序: package main import ( "time" ) func main() { time.Sleep(1000 * time.Second) } 在运行过程中,我检查进程的线程数: # cat /proc/13858/status | grep Thread Threads: 5 在RHEL上使用pstack命令时,它只打印一个线程的堆栈: # pstack 13858 Thread 1 (process 13858): #0 runtime.futex () at /usr/local/go/src/runtime/sys_linux_amd64.s:307 #1 0x0000000000422580 in runtime.futexsleep (addr=0x4c7af8 <runtime.timers+24>, val=0, ns=999999997446) at /usr/local/go/src/runtime/os1_linux.go:57 #2 0x000000000040b07b in runtime.notetsleep_internal (n=0x4c7af8 <runtime.timers+24>, ns=999999997446, […]

.lib中的函数被定义,但是当我从相同的.lib生成.so时,该函数不存在

我有一个函数fun1(),它显示了当我做nm时定义的lib1.lib。 我创buildmy.so出my.lib。 但是,当我searchmy.so那fun1()是根本不存在的,因为可能没有调用者编译器可能会忽略它。 所以我创build了一些虚拟数组 char* dummyArray={ &fun1; }; 在fun1()被定义的文件中。 但是这也是行不通的。 请帮助。

为什么在连接tracee的时候GDB可以屏蔽tracee的SIGKILL?

信号(7)手册页说, SIGKILL不能被捕获,阻塞或忽略。 但是我刚才注意到,在使用GDB连接到一个进程后,我不能再发送SIGKILL到这个进程(同样,其他的信号也不能传送)。 但是在我分离并退出GDB之后, SIGKILL像往常一样交付。 在我看来,GDB在连接时阻止了该信号(代表tracee),并在分离时解除阻塞。 但是, ptrace(2)手册页说: 在跟踪的过程中,即使信号被忽略,每次信号传递时Tracee也会停止。 ( SIGKILL是一个例外,具有其通常的效果。) 那为什么这样呢? GDB使用什么技巧? 这是一个示范的简单例子: testing程序 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <string.h> /* Simple error handling functions */ #define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) struct sigaction act; void sighandler(int signum, […]