C ++:崩溃时不显示glibc的Backtrace和内存映射 [英] C++: Do not show glibc's Backtrace and Memory map on crash

查看:132
本文介绍了C ++:崩溃时不显示glibc的Backtrace和内存映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm working on automatic C++ code testing using Python. So I have a Python script that compiles and executes C++ code. When the C++ code crashs, libc output is visible from my Python script output, even if I redirected cout and cerr of the C++ program being executed to /dev/null.

以下是解决问题的示例:

Here is a sample isolating the problem:

#! /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错误报告?

Is it possible to make execution not show the whole glibc error report?

注意:在运行python脚本之前,我在外壳程序中尝试过set LIBC_FATAL_STDERR_=1,但是它根本无法解决问题.

Note: I tried set LIBC_FATAL_STDERR_=1 in my shell before running the python script but it did not fix the problem at all.

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

I'm using Python 2.7.4 and g++ 4.4.7

推荐答案

以下内容对我有用(通过使glibc向stderr而不是/dev/tty写入错误):

The following works for me (by making glibc write errors to stderr instead of /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()

这篇关于C ++:崩溃时不显示glibc的Backtrace和内存映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆