C++:崩溃时不显示 glibc 的回溯和内存映射

2023-12-21

我正在使用 Python 进行自动 C++ 代码测试。所以我有一个编译和执行 C++ 代码的 Python 脚本。当 C++ 代码崩溃时,即使我重定向,libc 输出也可以从我的 Python 脚本输出中看到cout and cerr正在执行的 C++ 程序的/dev/null.

这是隔离问题的示例:

#! /usr/bin/env python
# -*- coding: utf8 *-*

import sys
import os.path
import subprocess
import shutil
import tempfile
import string
import argparse

bug_folder = tempfile.mkdtemp("bug")

# Create main.cpp
with open( os.path.join(bug_folder,'main.cpp'), "w") as mainfile: 
    mainfile.write( "int main()\n" )
    mainfile.write( "{\n" )
    mainfile.write( "   int* toto = new int(4);\n" )
    mainfile.write( "   delete toto;\n" )
    mainfile.write( "   delete toto;\n" )
    mainfile.write( "}" )

# Create Makefile    
project = "bug"
with open( os.path.join(bug_folder,'Makefile'), "w") as makefile: 
    makefile.write( "PROG = " + project + "\n" )
    makefile.write( "OBJS = main.o\n" )
    makefile.write( "CC = g++\n" )
    makefile.write( "CFLAGS = -Wall -g -pedantic\n" )
    makefile.write( "\n" )
    makefile.write( "$(PROG): $(OBJS)\n" )
    makefile.write( "\t$(CC) $(CFLAGS) -o $@ $(OBJS)\n" )
    makefile.close()

# Compile
delete_folder = True
old_path = os.getcwd()
os.chdir(bug_folder)
if subprocess.call(["make"]) == 0 and os.path.isfile( project ):
    # Project could be compiled!!
    print "Running program..."
    with open( os.devnull, "w") as outfile: 
        with open( os.devnull, "w") as errfile: 
            subprocess.call( [os.path.join(bug_folder,project)], stdout=outfile, stderr=errfile )
    print "Done"
else:
    print "Failed to compile (" + bug_folder + ")"
    delete_folder = False

os.chdir(old_path)

if delete_folder:
    shutil.rmtree( bug_folder )

程序输出为:

g++    -c -o main.o main.cpp
g++ -Wall -g -pedantic -o bug main.o
Running program...
*** glibc detected *** /tmp/tmpxX20mLbug/bug: double free or corruption (fasttop): 0x00000000006cc010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x328c275e66]
/tmp/tmpxX20mLbug/bug[0x40063b]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x328c21ed5d]
/tmp/tmpxX20mLbug/bug[0x400549]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:12 93358464                           /tmp/tmpxX20mLbug/bug
00600000-00601000 rw-p 00000000 00:12 93358464                           /tmp/tmpxX20mLbug/bug
006cc000-006ed000 rw-p 00000000 00:00 0                                  [heap]
328be00000-328be20000 r-xp 00000000 fd:00 136549                         /lib64/ld-2.12.so
328c01f000-328c020000 r--p 0001f000 fd:00 136549                         /lib64/ld-2.12.so
328c020000-328c021000 rw-p 00020000 fd:00 136549                         /lib64/ld-2.12.so
328c021000-328c022000 rw-p 00000000 00:00 0 
328c200000-328c38a000 r-xp 00000000 fd:00 136550                         /lib64/libc-2.12.so
328c38a000-328c58a000 ---p 0018a000 fd:00 136550                         /lib64/libc-2.12.so
328c58a000-328c58e000 r--p 0018a000 fd:00 136550                         /lib64/libc-2.12.so
328c58e000-328c58f000 rw-p 0018e000 fd:00 136550                         /lib64/libc-2.12.so
328c58f000-328c594000 rw-p 00000000 00:00 0 
328c600000-328c683000 r-xp 00000000 fd:00 136551                         /lib64/libm-2.12.so
328c683000-328c882000 ---p 00083000 fd:00 136551                         /lib64/libm-2.12.so
328c882000-328c883000 r--p 00082000 fd:00 136551                         /lib64/libm-2.12.so
328c883000-328c884000 rw-p 00083000 fd:00 136551                         /lib64/libm-2.12.so
390fa00000-390fa16000 r-xp 00000000 fd:00 131093                         /lib64/libgcc_s-4.4.7-20120601.so.1
390fa16000-390fc15000 ---p 00016000 fd:00 131093                         /lib64/libgcc_s-4.4.7-20120601.so.1
390fc15000-390fc16000 rw-p 00015000 fd:00 131093                         /lib64/libgcc_s-4.4.7-20120601.so.1
390fe00000-390fee8000 r-xp 00000000 fd:00 658079                         /usr/lib64/libstdc++.so.6.0.13
390fee8000-39100e8000 ---p 000e8000 fd:00 658079                         /usr/lib64/libstdc++.so.6.0.13
39100e8000-39100ef000 r--p 000e8000 fd:00 658079                         /usr/lib64/libstdc++.so.6.0.13
39100ef000-39100f1000 rw-p 000ef000 fd:00 658079                         /usr/lib64/libstdc++.so.6.0.13
39100f1000-3910106000 rw-p 00000000 00:00 0 
7f302c4bb000-7f302c4c0000 rw-p 00000000 00:00 0 
7f302c4e5000-7f302c4e7000 rw-p 00000000 00:00 0 
7fffc6840000-7fffc6856000 rw-p 00000000 00:00 0                          [stack]
7fffc6a00000-7fffc6a01000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Done

我会比较喜欢:

g++    -c -o main.o main.cpp
g++ -Wall -g -pedantic -o bug main.o
Running program...
Done

是否可以使执行不显示整个 glibc 错误报告?

注意:我尝试过set LIBC_FATAL_STDERR_=1在运行 python 脚本之前在我的 shell 中,但它根本没有解决问题。

我正在使用 Python 2.7.4 和 g++ 4.4.7


以下对我有用(通过使 glibc 写入错误stderr代替/dev/tty):

import copy
import os

# ...

with open(os.devnull, "w") as outfile:
    with open(os.devnull, "w") as errfile:
       env = copy.copy(os.environ)
       env["LIBC_FATAL_STDERR_"] = "1"
       p = subprocess.Popen([os.path.join(bug_folder, project)],
                            stdout=outfile, stderr=errfile, env=env)
       p.wait()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:崩溃时不显示 glibc 的回溯和内存映射 的相关文章

随机推荐

  • CKEditor 对话框:通过 ID 引用输入字段

    CKEditor 对话框中的每个输入字段均使用唯一的编号重命名 但该编号会根据可见的选项而变化 我需要引用 txtUrl 它的 id 类似于 35 textInput 到目前为止 我发现这样的事情应该有效 alert CKEDITOR in
  • 将 Drupal 7 站点移至其他服务器,无法登录

    我最近将 Drupal 7 站点移至新的托管服务器 但我被困在登录页面 当我尝试登录时 我会被引导回同一页面 但 URL 会从 user to user 1 这让我相信我实际上已经登录 但我没有被转发到正确的页面 我尝试清理缓存 清空数据库
  • 在 Android 中什么时候使用片段,什么时候不使用片段?

    我是 Android 新手 我想制作一个应用程序 所以 我看到了很多教程 其中一些教程说我需要使用片段 但在其他教程中说 如果我想要或仅当我的应用程序是对于平板电脑 所以 当我必须使用片段和何时不使用片段时 我真的对此感到困惑 请向我解释何
  • JWT 令牌 SSO 流程

    我有一个关于 JWT 的 SSO 流程的简单问题 假设我们有单独的授权服务器 它向客户端应用程序 服务器和资源服务器提供 JWT 客户端尝试使用该令牌进行访问 问题是 资源服务器应该自行验证令牌 例如与身份验证服务器共享私有证书 还是应该请
  • Delphi 程序被 ClamAV 检测为误报

    我的 Delphi XE2 程序是always检测到含有病毒Jotti http virusscan jotti org en由 ClamAV 提供 而其他病毒扫描程序未检测到任何内容 AFAIK ClamAV通常与邮件服务器一起使用 那么
  • CefSharp WpfControl 和渲染到图像

    我们想要在 wpf 应用程序中的基于 chromium 的浏览器中显示网页 在浏览器中显示的网站也应该显示在另一个屏幕上 但没有交互 我想将 cefsharp wpf 浏览器控件和 cefsharp 离屏渲染结合起来 我可以使用一个 chr
  • 为什么 time.clock() 在 Windows Server 2008 X64 上返回如此大的值

    我在不同的机器上运行以下脚本并得到了完全不同的结果 经过的 time clock 太大了 Script import time start clock time clock time sleep 60 end clock time cloc
  • MacO 上的 PyOpenGL OpenGL 版本

    有人告诉我将旧配置文件从其他 stackoverflow 帖子切换到核心配置文件 但我似乎找不到方法来做到这一点 因此 我发布了一个更新的错误帖子来帮助我找到一种方法 CODE import glfw numpy from OpenGL G
  • 如何将 YYYYMMDDHHMMSS 转换为“date”可读的日期

    我有一组 YYYYMMDDHHMMSS 格式的日期 时间字符串 我想将其转换为可读的内容date公用事业 通常 我可以这样做 date d 2010 10 01 12 34 56 然而 date不喜欢 YYYYMMDDHHMMSS date
  • Python 相当于 Matlab 的clear、close all、clc

    在Matlab中 在每个文件的开头 我通常写 clear close all clc Python中有类似的东西吗 大多数人在测试脚本时会做什么 这里的问题是 plt show 是阻塞的 并且在手动关闭窗口之前不会返回到脚本 您可以尝试 p
  • 类型错误:__init_subclass__() 不接受关键字参数

    我正在尝试创建一个元类 但是当我将其分配给另一个类时 我收到错误 类型错误 init subclass 不接受关键字参数 但我没有实施任何 init subclass 为什么要调用这个函数 class Meta type def new c
  • 回形针 - 保存文件后运行方法?

    我正在开发一个需要接受文件上传的项目 文件上传后 我正在进行一些处理 从文件中提取信息 我最终计划在后台工作程序中运行它 但它目前正在内联运行 我尝试使用 after create 和 after save 来处理文件 但似乎我的方法是在
  • 如何在 MATLAB 编辑器中启用自动单词完成功能?

    我可以通过按 Tab 在 MATLAB 命令提示符下使用自动单词完成功能 但在使用 m 文件的编辑器时无法执行此操作 有什么方法可以在编辑器中使用制表符补全吗 根据这篇 MathWorks 博客文章 http blogs mathworks
  • LinkedIn 分享按钮 - 无法识别 og:image

    我正在尝试与 og 标签共享页面 其中一个标签是 og image 如以下链接所述 https developer linkedin com documents setting display tags shares https devel
  • 在 vim 中打开与当前文件相同的文件夹中的文件

    在vim中 当我打开一个缓冲区时 我经常需要加载该文件所在目录中的另一个文件 但因为我通常不这样做cd进入其中 将pwd是父文件夹 所以我每次都必须重新输入路径 这有捷径吗 或者将密码更改为文件所在目录的方法 example cd src
  • 如何确定一个 3D 对象是否适合另一个 3D 对象(容器)?

    给定两个 3D 对象 我如何找到一个是否适合第二个对象 并找到该对象在容器中的位置 应平移和旋转对象以适合容器 但不得进行其他修改 其他并发症 相同的情况 但寻找最适合的解决方案 即使它不是正确的匹配 最小化不适合容器的物体的体积 支持弹性
  • Puppeteer:如何监听对象事件

    是否可以监听页内对象调度的事件 假设我访问的页面中有以下代码 var event new CustomEvent status detail ok window addEventListener status function e cons
  • 强制 git push + pull 超时

    我发现的所有问题都想避免 git 推 拉超时 就我而言 我想强迫他们 我的推 拉都是通过 ssh 传输到在某个时间点可能不可用的远程计算机 例如 我有一个脚本可以推送到两个远程公共存储库 我不希望这个脚本在推送到第一个存储库并且该机器不可用
  • Flexslider 和从右到左的语言支持

    我在 WordPress 上安装了一个包含 Flexslider 的模板 我的语言是从右到左 RTL 书写的 当页面为 RTL 时 Flexslider 停止并且不显示图像 我该如何解决这个问题 Flex 滑块不支持 RTL 语言 解决这个
  • C++:崩溃时不显示 glibc 的回溯和内存映射

    我正在使用 Python 进行自动 C 代码测试 所以我有一个编译和执行 C 代码的 Python 脚本 当 C 代码崩溃时 即使我重定向 libc 输出也可以从我的 Python 脚本输出中看到cout and cerr正在执行的 C 程