核心转储只收集进程空间,而不是为进程间通信创build的共享内存。 我怎样才能让核心转储包含运行进程的共享内存呢?
有没有办法在Linux中创build进程崩溃[如在Windows]的微型转储。 通常的核心转储大小很大,但是我只想得到转储的堆栈跟踪。 是否有可能只转储堆栈跟踪? 我猜设置ulimit值的最大值不会帮助我,因为我不关心的大小,我只是不需要一个完整的内存转储。 此外,我读了谷歌的Breakpad,但Breakpad会让我不得不钻研代码来设置它。 我不想修改代码。
我试图从我写的代码中获得可用的核心转储。 我的来源是在Windows和Linux操作系统之间共享的NTFS分区。 我正在Linux下进行开发,并在我的bash shell中设置了ulimit -c unlimited 。 当我在NTFS分区上的项目目录中执行代码时,故意导致SIGSEGV或SIGABRT,系统写入一个零字节的核心转储文件。 如果我在我的主目录(一个ext4分区)执行二进制文件,核心转储生成正常。 我已经看了核心的手册页 ,它给出了一个不生成核心转储文件的各种情况的列表。 但是,我不认为这是一个权限问题,因为该分区上的所有文件和目录都具有完全的权限( chmod 777 )。 任何帮助或想法赞赏。
TLDR :即使在设置ulimit并查看apport后也找不到核心转储。 生病辛苦得到一个单一的回溯。 在底部的问题。 我在这里有一个小恶梦。 我目前正在做一些C编码,在我的情况下,总是意味着一吨的段错误。 大多数情况下,我能够很less或没有问题地重现错误,但是今天我碰壁了。 我的代码产生segfaults不一致。 我需要那个正在谈论的核心转储。 所以我正在寻找一个核心转储,为我的小宝贝a.out。 那就是当我开始拉我的头发 。 我的直觉会告诉我,核心转储文件应该存储在工作目录的某处 – 显然不是这样的。 读完这个之后 ,我愉快地input: ulimit -c 750000 没事了。 我的程序输出告诉我,它做了核心转储 – 但我无法find它在cwd。 所以读完这个之后我才知道我应该做一些apport和core_pattern 。 改变core_pattern对于获得一个核心转储似乎有点太过分了,我真的不想惹它,因为我知道我以后会忘记它。 我倾向于把这些事情搞得很糟糕。 Apport有这样的魔法属性select哪些核心转储是有价值的,哪些不是。 这是日志告诉我… ERROR: apport (pid 7306) Sun Jan 3 14:42:12 2016: executable does not belong to a package, ignoring …我的程序不够好。 这个核心转储文件在哪里? 有没有办法让一个核心转储手动一次,而不必设置一切? 我本身很less需要这些文件,大部分时间GDB本身就足够了。 像let_me_look_at_the_core_dump <program name>会很好。 我已经秃顶一点,所以任何帮助将不胜感激。
我打算devise一个C / C ++应用程序,作为恶魔进程运行,并在应用程序日志文件发生时收集核心转储。 从哪里可以知道一个应用程序崩溃的Linux有什么办法吗?
我有一个程序,这是由kill -STOP停止。 我想把它的核心转储不运行它(程序必须停止所有的时间;如果它会收到一个SIGCONT,它将死亡没有coredump)。 我怎样才能得到一个coredump? 是否有可能使程序在使用coredump之后保持当前状态? 这是一个非常罕见的情况,我不能复制它,但我必须分析它。 谢谢 更新:gcore不起作用。 Gdb(甚至根)不能附加到停止的进程(在ptrace PTRACE_ATTACH上永远等待)。 即使dd无法从/ proc / 99999 / maps读取具有良好偏移量的/ proc / 99999 / mem(错误No such process )。 如果我尝试附加gdb来处理和发送SIGCONT到停止的进程,我得到了 path… linux-nat.c:####: internal-error: linux_nat_attach: Assertion `pid == GET_PID (inferior_ptid) && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP' failed. A problem internal to GDB has been detected, further debugging may prove […]
我们有一个在Linux 2.6.32上运行的posixmultithreadingC ++程序,在其中一个线程中进行核心转储。 使用gdb-7.2 corss-compiled分析核心文件,我们看到错误指令在这里 0x11491178 <+208>: lwz r0,8(r9) 并在框架中注册显示: (gdb) info reg r0 0x0 0 …. r9 0xdeaddead 3735936685 这是有道理的,因为r9在进程/线程的上下文中有一个无效的地址值(实际上是我们写的堆清理模式)。 令人困惑的是,r9是这样加载的 0x1149116c <+196>: lwz r9,0(r4) r4包含(第一个也是唯一)函数参数“data”的值。 GDB告诉我关于数据的以下信息: (gdb) p data $6 = (TextProcessorIF *) 0x4b3fe858 (gdb) p *data $7 = {_vptr.TextProcessorIF = 0x128b5390} (gdb) info symbol 0x128b5390 vtable for TextProcessorT<unsigned short> + 8 in […]
是否有可能使gdb自动find相应的可执行文件? 我已经提取了debugging符号,并把它们放在/usr/lib/debug/.build-id/目录中。 当我用gdb /usr/bin/executable core启动gdb时,一切正常。 所有可执行文件和所有共享库的debugging符号都会自动加载,因为gdb知道构build标识并自动加载它。 $ gdb /usr/bin/executable core GNU gdb (GDB) 7.0.1-debian Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" […]
我有一个Perl脚本(在VirtualBox内的Xubuntu Lucid Lynx上运行),它包装了几个C / C ++二进制文件,将其中一个的input提供给其他人。 其中一条线一般包括: my $ret_code=`cat $input | c_binary`; my $ret_val= $?; 对于一些input文件,代码会导致coredump,但$ret_val和$ret_code分别为0和“”。 当我运行它时,我可以看到滚动的错误,但是我似乎没有办法“编程”这个程序。 我怎么能这样做? 意图是错误地从input中删除一些行,然后重试parsing。 这里是错误: *** stack smashing detected ***: code/parser terminated ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0x798390] /lib/tls/i686/cmov/libc.so.6(+0xe233a)[0x79833a] code/parser[0x804edd8] [0x2e303039] ======= Memory map: ======== 0043b000-0043c000 r-xp 00000000 00:00 0 [vdso] 0045a000-00475000 r-xp 00000000 08:01 11041 /lib/ld-2.11.1.so 00475000-00476000 r–p 0001a000 08:01 11041 […]
当用gdb打开coredump的时候,gdb会尝试把完整的coredump加载到内存中吗? 我们在其中一个分段系统上发现了一个35Gb的芯片。 我们的操作指令要求使用gdb创build一个回溯。 恐怕gdb会尝试将完整的coredump加载到内存中,并通过使用所有可用的内存来使暂存区域不可用。 我们在RedHat EL 5 / 64bit安装上使用gdb 7.0.1。