2013-05-10 14 views
6

İşte kod snippet'im.mudflap, bellek ayırmak için new() operatörünü kullanırken çekirdek dökümü atar

int main() 
    { 
    int *var = new int(6); 
    cout<<"Hello\n"; 
    delete var; 
    return 0; 
} 

$export MUDFLAP_OPTIONS="-print-leaks -mode-check" 
$g++ test.cpp -fmudflap -lmudflap 
$./a.out 
Segmentation fault (core dumped) 

olarak çamurluk ile derlenmiş Ama çamurluk seçeneği olmadan derlenmiş zaman 'core atmak vermediğinde. Mudflap’da yeni. Lütfen yanlış bir şekilde çamurluğunu kullanıp kullanmadığımı söyle. Bilginize

:

Çekirdek `./a.out' tarafından oluşturulan coredump tam bt

$uname -a 
Linux localhost.localdomain 2.6.18-308.4.1.el5 #1 SMP Wed Mar 28 01:54:56 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux 
$g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux-gnu/4.7.3/lto-wrapper 
Target: x86_64-redhat-linux-gnu 
Configured with: /root/rohit/gcc-4.7.3/configure --prefix=/usr/ 
Thread model: posix 
gcc version 4.7.3 (GCC) 

. Benim derleyici (x86 Solaris) üzerinde Olduğu Gibi

Program terminated with signal 11, Segmentation fault. 
[New process 22176] 
#0 0x0000003ca5e075c8 in ??() from /lib64/libgcc_s.so.1 
(gdb) bt ful 
#0 0x0000003ca5e075c8 in ??() from /lib64/libgcc_s.so.1 
No symbol table info available. 
#1 0x0000003ca5e0882b in _Unwind_Backtrace() from /lib64/libgcc_s.so.1 
No symbol table info available. 
#2 0x0000003c96ce5eb8 in backtrace() from /lib64/libc.so.6 
No symbol table info available. 
#3 0x00002b4acf58b417 in __mf_backtrace (symbols=0x6a51db8, guess_pc=0x2b4acf58d351, guess_omit_levels=2) 
    at /root/rohit/gcc-4.7.3/libmudflap/mf-runtime.c:1981 
     pc_array = (void **) 0x6a51e00 
     pc_array_size = 6 
     remaining_size = <value optimized out> 
     omitted_size = Unhandled dwarf expression opcode 0x9f 
     i = <value optimized out> 
#4 0x0000000000000002 in ??() 
No symbol table info available. 
#5 0x0000000000000004 in ??() 
No symbol table info available. 
#6 0x0000000000000000 in ??() 
No symbol table info available. 
+6

Sadece bir uyarı olarak, kodunuzun * bir dizi oluşturmadığını anlıyorsunuz, değil mi? – BoBTFish

+0

Tüm işler benim için uygun Red Hat 5.4, gcc 4.7.2 – BoBTFish

+1

Geri tepmeyi de dahil etmeyi önerebilir miyim? Backtrace almak için, çekirdek gübresini 'gdb' (' gdb a.out core') ile açın ve içindeki 'bt' komutunu kullanın. –

cevap

0

Sizin örnek derler, ama gerçekten, platformu bir fark yaratmak duyulmayacak kadar basittir. Yazdığınız gibi kodunuz her yerde derlenmeli ve çalışmalıdır. MudFlap'ın bazı kusurları gibi görünüyor.

benim şimdiki ortamda MUDFLAP erişebilir ama burada tamamen sorunu önlemek sağlayacak olabilecek bir şey yoktur: dinamik ayırma

#include <iostream> 
#include <boost/shared_ptr.hpp> 
using namespace std; 

int main() { 
boost::shared_ptr<int> var (new int(6)); 
cout << "Hello #" << *var << endl; 
return 0; 
} 

ben "gizleme" diye bir tahminde yapıyorum Akıllı işaretçi başlatma içinde MudFlap hile olacaktır.

Snippet'inizin gerçek bir dünya sorununu basitleştirdiğini tahmin edeceğim. Basitleştirilmiş sürümün bile sizin ortamınızda oluşturmayacağına dair bir ipucum olmamasına rağmen (yukarıdaki gibi), yukarıdaki çözüm, işaretçiyi silme konusunda endişelenmenize gerek yok, ancak gerçek dünya kapsamı büyüktür. Daha sonra, belki de MudFlap gerçekten akıllı ve RAII'yi kullanmaya zorlamak için çalışıyor. Belki de, ham işaretçileri kullanmak ve yönetmek istediğinizi belirtmenize izin veren bir yapılandırma ayarı vardır. Durum ne olursa olsun, akıllı işaretçi yaklaşımıyla gitmek için iyi bir şekilde hizmet vermiş olursunuz.

Yardım edin ve yardımcı olup olmadığını bize bildirin.

İlgili konular