Articles of debugging

检查正在运行的程序中的内存泄漏

出于对检查内存泄漏的好奇心,我有个疑问。 作为一个在过去的一两年中经常使用valgrind来检查代码中的内存泄漏的人,我突然想到在程序生命周期之后 ,它只能检测到丢失/未logging的内存。 所以,有鉴于此,我在想,如果你有一个长期运行的程序, malloc()是间歇性的,在应用程序退出之前不会free() ,那么潜在的吃内存(不一定是通过泄漏 )是巨大的,使用这些工具是不可观察的,因为他们只检查程序的生命周期。 是否有类似GDB的工具可以在运行时停止应用程序,并检查在应用程序生命周期中是否被引用的内存?

你如何设置debugging过程的当前目录?

我有一个应用程序是敏感的目录它被调用 – 它加载一些文件使用相对path。 当我通过debugging器启动程序时,如何控制当前的初始目录? 我宁愿避免添加特殊的代码到debugging的程序,使其调用chdir ; 我的直觉是,debugging器应该提供某种方式来指定外部,因为无论如何它本质上是一个外部设置。 我正在使用的debugging器是TotalView,但我打开其他Linuxdebugging器的答案,因为它可以帮助我find一个类似的电视设置。 当我调用程序时,我可以指定环境variables,所以在百灵公司,我试图设置PWD ,但没有运气。

如何访问.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自动查找来源?

perl-mechanize遇到限制 – 开始几个debugging尝试

你好亲爱的开发者 首先 – 抱歉作为新手..我是相当新的Perl。 我试图学习一些关于Perl的同时玩代码和片段。 今天我有一个脚本,运行一个机械化的工作..但有点不跑到最后。 Waht的目标是:我想获得一些wesite-sceenshots的缩略图。 以及我运行这个脚本,这是写的做一些网站的截图我也起来和运行mozrepl。 最奇怪的是输出 – 见下面…问题:我应该改变脚本为什么我输出? #!/usr/bin/perl use strict; use warnings; use WWW::Mechanize::Firefox; my $mech = new WWW::Mechanize::Firefox(); open(INPUT, "<urls.txt") or die $!; while (<INPUT>) { chomp; print "$_\n"; $mech->get($_); my $png = $mech->content_as_png(); my $name = "$_"; $name =~s/^www\.//; $name .= ".png"; open(OUTPUT, ">$name"); print OUTPUT $png; sleep (5); […]

在Visual Studio 2017中使用远程debugging时,Linux控制台输出在哪里?

我的Visual Studio 2017(VS2017)通过以下代码成功连接到Linux系统: #include <cstdio> int main() { printf("hello from ConsoleApplication1!\n"); return 0; } 但是,执行代码时,我看不到“ConsoleApplication1的问候! 消息在VS2017输出窗口中。 我在哪里可以find它?

亚马逊linux – 安装openjdk-debuginfo?

我试图在amazon linux上使用ec2实例上的jstack 。 所以我安装了openjdk-devel软件包。 sudo yum install java-1.7.0-openjdk-devel.x86_64 但是jstack引发了exceptionjava.lang.reflect.InvocationTargetException 。 sudo -u tomcat jstack -J-d64 -m 941 谷歌会议15分钟后,我发现一些qna说安装openjdk-debuginfo软件包可能会有所帮助。 但是我怎样才能安装openjdk-debuginfo ? 这不是在yum search 。

逐行debugging

我有一个用帕斯卡写的脚本。 我会这样debugging它:停在每一行,转储内存中所有variables的值,并转到下一行。 是否有可能使用gdb或其他一些开放源码的Linux工具?

ASLR和地址

看看这个主要的: int main() { int asd = 10; printf("%p\n", &asd); return 0; } asd在给定时刻的地址: 0x7ffff5f7c16c 主要地址(总是一样的): (gdb) disass main Dump of assembler code for function main: 0x00000000004005b4 <+0>: push %rbp 为什么一个正则c程序的variables的地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置独立的)? 我发现地址变化是由ASLR模式引起的,但是为什么它只影响程序variables,并不影响代码的分配位置? 这是否与作为代码部分ro的事实有关,如果不是绝对必要的,它是没有意义的随机化的? 此外,为什么主要的地址与variablesasd的地址之间有巨大的差距?

有一个函数来调用堆栈转储在C?

有人可以提供一个C函数的实现,被调用来转储当前的堆栈吗? 这是一个x86 linux系统。 它可以通过两种方式调用:明确地由另一个函数或崩溃后(可能作为陷阱/ int处理程序)。 输出可以是屏幕或文件,如参数(句柄)所示。 如何解开堆栈的明确解释/评论显然是非常有用的。 谢谢。

用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 […]