Articles of debugging

用ftrace和kprobes捕获用户空间程序集(通过使用虚拟地址转换)?

对于这个冗长的post道歉,我很难用更短的方式来制定它。 此外,也许这是更适合Unix和Linux堆栈交换,但我会先在这里尝试,因为有一个ftrace标记。 无论如何 – 我想观察一个用户程序的机器指令执行在一个完整的function_graph捕获使用ftrace的上下文。 一个问题是,我需要这个旧的内核: $ uname -a Linux mypc 2.6.38-16-generic #67-Ubuntu SMP Thu Sep 6 18:00:43 UTC 2012 i686 i686 i386 GNU/Linux …在这个版本中,没有UPROBES ,就像3.5中的Uprobes所指出的那样,应该可以做这样的事情。 ( 只要我不需要修补原来的内核,我愿意尝试一个由树build立的内核模块,就像用户空间探测器(Uprobes)[chunghwan.com]似乎performance出来的那样;但是至于我可以从0看到:基于Inode的接口(LWN.net) ,2.6可能需要一个完整的补丁 ) 但是,在这个版本中,有一个/sys/kernel/debug/kprobes和/sys/kernel/debug/tracing/kprobe_events ; 和Documentation / trace / kprobetrace.txt意味着一个kprobe可以直接在一个地址上设置; 即使我在任何地方都找不到有关如何使用它的例子。 在任何情况下,我仍然不确定要使用哪个地址 – 作为一个小例子,假设我想跟踪wtest.c程序main函数的开始(以下包含)。 我可以这样做来编译和获取机器指令汇编清单: $ gcc -g -O0 wtest.c -o wtest $ objdump -S wtest | less […]

当我从Docker容器中运行它时,gdb没有命中任何断点

问题 我能够设置和达到一个断点,如果我从主机编译和运行,但如果我从docker容器内做到这一点gdb不会击中设置的断点。 重现步骤(所有片段都准备好复制粘贴) 创build一个docker文件: cat << EOF > Dockerfile FROM ubuntu RUN apt-get update RUN apt-get install -y build-essential gdb EOF 构build一个图像并在其中运行一个交互式会话: docker build -t gdb_problem_testing . && docker run –rm -it gdb_problem_testing bash 从容器内部创build一个小的main.cpp,编译并运行gdb: cat <<EOF > main.cpp && g++ -g main.cpp && gdb -ex 'break 5' -ex 'run' ./a.out #include <iostream> int main(int […]

为什么我在这里得到一个SIGABRT?

我有这个代码段,我打开/closures一个文件多次(在一个循环中): for(i=1;i<max;i++) { /* other code */ plot_file=fopen("all_fitness.out","w"); for (j=0;j<pop_size;j++) fprintf(plot_file, "%lf %lf\n",oldpop[i].xreal[0],oldpop[i].obj); fclose(plot_file); /*other code*/ } 我在这里得到一个SIGABRT,跟踪如下: #0 0x001fc422 in __kernel_vsyscall () #1 0x002274d1 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0x0022a932 in *__GI_abort () at abort.c:92 #3 0x0025dee5 in __libc_message (do_abort=2, fmt=0x321578 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 #4 0x00267ff1 […]

Linux内核硬件断点

我想为x86架构构build一个简单的Linux内核debugging器。 我首先要设置断点。 我想知道是否有一个内核apiconfigurationdebugging器寄存器,如果是这样的任何良好的文档? 如果debugging器没有内核API,那么是否有任何关于如何手动正确configuration寄存器的文档(使用程序集“MOV”指令)?

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

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

debugging长时间运行的PHP脚本

我有php脚本运行作为一个cron工作,广泛使用第三方代码。 脚本本身有几千LOC。 基本上它是数据导入/处理脚本。 (JSON到MySQL,但它也使得很多的HTTP调用和一些SOAP)。 现在,业绩随着时间而下降。 当用几条logging(大约100条)进行testing时,性能是好的,在10-20分钟内完成。 运行整个import(约1600条logging)时,一条logging平均import时间稳定增长,整个工作时间超过24小时,至less比预期长5倍。 内存似乎不是一个问题,使用量增长应该没有意外的高峰。 所以,我需要debugging才能find瓶颈。 这可能是脚本,底层代码库,PHP本身,数据库,操作系统或networking部分的一些问题。 现在我怀疑某种地方的caching行为不好,几乎有100%的错过率。 我不能使用XDebug,configuration文件增长得太快,无法处理。 所以问题是: 我怎样才能debugging这种脚本? PHP版本:5.4.41操作系统:Debian 7.8如果需要,我可以拥有root权限,并安装这些工具。 但它是生产服务器,理想的debugging不应该太扰乱。

如何正确debugging一个bash脚本

我在bash脚本中使用下面的代码来追踪代码 #!/bin/bash function trace() { echo "TRACE" \ "${BASH_SOURCE[1]}:${BASH_LINENO[0]}:${FUNCNAME[1]}:" \ "$BASH_COMMAND" } set -o functrace shopt -s extdebug trap trace DEBUG # Remainder of code here exit 0 但是当我运行它,它吃我的variables。 一些线索?

如何用C语言的内存地址映射函数名和行号?

如何在GCC中将函数名和行号映射回内存地址? 即假设一个C语言的原型: void func() { // Get the address of caller , maybe this could be avoided MemoryAddress = get_call_address(); // Which line from source code is executing , which calls func() LineNumber = get_lineno_from_symbol ( &MemoryAddress ); // Grab the name who calls func() FunctionName = get_func_from_symbol ( &MemoryAddress ); } 那么GCC提供的任何现有的API或其他什么都可以满足我的要求? 非常感谢你们的答复;

在Eclipse CDT中为远程debugging启动部署文件的正确方法是什么?

我的情况:我目前正在尝试使用Eclipse CDT作为专有IDE的替代品。 我有一个企业应用程序,它由一个可执行文件和很多(30+)共享库模块组成。 该应用程序是针对embedded式非x86平台,POSIX兼容操作系统(QNX或GNU / Linux,取决于所选的工具链)。 因此,debugging不能在开发人员的机器上完成。 它必须远程完成。 我将Eclipse Luna / CDT 8.5与远程系统资源pipe理器插件和GDB / DSF Create Process Launcher一起使用。 通过这些插件,Eclipse可以远程启动一个程序,并用gdbserver进行debugging。 但只有主要的可执行文件可以configuration上传。 我想知道通过Eclipse部署远程debugging文件的适当方式是什么? 我目前的select是: 使用“远程系统资源pipe理器”透视图,将某个远程文件夹“导入”为工作空间中的“远程项目”。 设置Makefile将.so文件复制到生成后的映射文件夹。 生成后,手动刷新“远程项目”。 然后,文件将被上传到远程系统。 使用远程系统资源pipe理器透视图,将工作区中的二进制文件“导出”到远程文件系统,以便在远程启动时上传文件。 此方法还要求我在开始debugging会话之前“刷新”所有项目,否则将不会公布更改。 根本不要使用Eclipse进行file upload,也可以手动或通过构build脚本进行部署。 采取困难的方式,并提供一些代码到EclipseСDT。 有更好的解决scheme吗?

如何逐行运行Linux程序

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