2012-02-15 31 views
2

私はC++で多くのテキストファイルを解析するプログラムを作成しています。私はvalgrindでプログラムを実行すると、多くのエラーに直面しています。C++がサイズ4の書き込み/読み込みが多すぎます

私はUbuntu 11を使用しています。コンパイラはg ++です。 プログラムの目的は、オプションの参照ファイル、作業するメインファイル、生成する10個以上の行、および生成する14個のファイルのルート名を引数として受け取ることです。

私は最初の主な問題から始めます:プログラムの奇妙な振る舞いに従います(ときどき動作しますが、ファイルや引数として渡される文字列などによっては動作しないこともあります)。 valgrindと一緒に。これは、メモリ操作上の膨大な量のエラーを生成します。変数argvから開始します。

#include <iostream> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <sstream> 
    #include "coverSamMulti.h" 
    #include "string.h" 

    using namespace std; 

    int main(int argc, char **argv) { 
bool mutYN; 
char * filerefgen; // The reference genome files 
char * filemap; // the mapping file 
char * fileroot; // the root name of all the generated files 

// two or three arguments? 
if (argc == 3) 
    { 
     mutYN= false; 
     filemap = new char[strlen(argv[1])+1]; 
     fileroot = new char[strlen(argv[2])+1]; 
     strcpy(filemap,argv[1]); 
     strcpy(fileroot,argv[2]); 
    } 
    else if (argc == 4) 
    { 
     mutYN= true; 
     filerefgen = new char[strlen(argv[1])+1]; 
     filemap = new char[strlen(argv[2])+1]; 
     fileroot = new char[strlen(argv[3])+1]; 
     strcpy(filerefgen,argv[1]); 
     strcpy(filemap,argv[2]); 
     strcpy(fileroot,argv[3]); 
    } 
    else { 
     cout << " \n Less or or too much parameter passed \n"; 
     return 0; 
    } 


    //call of the main function 

    GenF_Inf genfinf = ScanReadsMap(filemap); 

    // We will store for each positions and in 14 files respectively the coverage, the coverage of A, G, C and T, 
    // the number mismatches,the number of first position alignment, the number of first position alignment on the reverse strand, 
    // and the consensus genome of the sample, the segments size, the insertfs, the firsts, the ins and the del, 



       char * filecov = (char *)malloc(sizeof(char)*(strlen(fileroot)+10)); 
       char * filecov_A = (char *)malloc(sizeof(char)*(strlen(fileroot)+12)); 
       char * filecov_G = (char *)malloc(sizeof(char)*(strlen(fileroot)+12)); 
       char * filecov_C = (char *)malloc(sizeof(char)*(strlen(fileroot)+12)); 
       char * filecov_T = (char *)malloc(sizeof(char)*(strlen(fileroot)+12)); 
       char * filemis= (char *)malloc(sizeof(char)*(strlen(fileroot)+10)); 
       char * filefirst= (char *)malloc(sizeof(char)*(strlen(fileroot)+10)); 
       char * filefirstr = (char *)malloc(sizeof(char)*(strlen(fileroot)+9)); 
       char * filecons = (char *)malloc(sizeof(char)*(strlen(fileroot)+9)); 
       char * fileseg = (char *)malloc(sizeof(char)*(strlen(fileroot)+9)); 
       char * fileinsert = (char *)malloc(sizeof(char)*(strlen(fileroot)+12)); // the different insertsize 
       char * filefirsts = (char *)malloc(sizeof(char)*(strlen(fileroot)+12)); // the first position on single mapped reads 
       char * fileins = (char *)malloc(sizeof(char)*(strlen(fileroot)+9)); // the different insertsize 
       char * filedel = (char *)malloc(sizeof(char)*(strlen(fileroot)+9)); // the first position on single mapped reads 

       //building files' name; 

       strcpy(filecov,fileroot); 
       strcpy(filecov_A,fileroot); 
       strcpy(filecov_C,fileroot); 
       strcpy(filecov_G,fileroot); 
       strcpy(filecov_T,fileroot); 
       strcpy(filemis,fileroot); 
       strcpy(filefirst,fileroot); 
       strcpy(filefirstr,fileroot); 
       strcpy(filecons,fileroot); 
       strcpy(fileseg,fileroot); 
       strcpy(fileinsert,fileroot); 
       strcpy(filefirsts,fileroot); 
       strcpy(fileins,fileroot); 
       strcpy(filedel,fileroot); 

       strcat(filecov, "_cov.txt"); 
       strcat(filecov_A, "_cov_A.txt"); 
       strcat(filecov_C, "_cov_C.txt"); 
       strcat(filecov_G, "_cov_G.txt"); 
       strcat(filecov_T, "_cov_T.txt"); 
       strcat(filemis, "_mis.txt"); 
       strcat(filefirst, "_first.txt"); 
       strcat(filefirstr, "_firstr.txt"); 
       strcat(filecons, "_cons.txt"); 
       strcat(fileseg, "_seg.txt"); 
       strcat(fileinsert, "_insert.txt"); 
       strcat(filefirsts, "_firsts.txt"); 
       strcat(fileins, "_ins.txt"); 
       strcat(filedel, "_del.txt"); 

       ofstream covf(filecov); 
       ofstream covf_A(filecov_A); 
       ofstream covf_C(filecov_C); 
       ofstream covf_G(filecov_G); 
       ofstream covf_T(filecov_T); 
       ofstream misf(filemis); 
       ofstream firstf(filefirst); 
       ofstream firstrevf(filefirstr); 
       ofstream consf(filecons); 
       ofstream segf(fileseg); 
       ofstream insertf(fileinsert); 
       ofstream firstsf(filefirsts); 
       ofstream insf(fileins); 
       ofstream delf(filedel); 


       // generating the files 

cout << "\n ====================================== \n "; 
cout << "\n Generating the files \n "; 
cout << "\n ====================================== \n "; 



for(int j=0;j < NSEG; j++) 
    { segf << genfinf.start[j]; 
      for (int i =0; i <genfinf.lenght[j]; i++) 
      { if ((j!=NSEG-1) && (i!= genfinf.lenght[NSEG-1]-1)){ 
       firstf << genfinf.mapfinf[j].firstposcov[i] << ","; 
       misf << genfinf.mapfinf[j].nbmismatch[i]<< ","; 
       covf << genfinf.mapfinf[j].poscov[i] << ","; 
       covf_A << genfinf.mapfinf[j].poscov_A[i]<< ","; 
       covf_C << genfinf.mapfinf[j].poscov_C[i]<< ","; 
       covf_G << genfinf.mapfinf[j].poscov_G[i]<< ","; 
       covf_T << genfinf.mapfinf[j].poscov_T[i]<< ","; 
       firstrevf<< genfinf.mapfinf[j].first_rev[i]<< ","; 
       insf << genfinf.mapfinf[j].ins[i]<< ","; 
       delf << genfinf.mapfinf[j].del[i]<< ","; 
       firstsf << genfinf.mapfinf[j].firstposcovsingle[i]<< ","; 
      }} 
    } 


for(int j=0;j < 999; j++) insertf << genfinf.insert[j]<< ","; 

int j = NSEG-1;int i = genfinf.lenght[NSEG-1]-1; 

firstf << genfinf.mapfinf[j].firstposcov[i] ; 
misf << genfinf.mapfinf[j].nbmismatch[i]; 
covf << genfinf.mapfinf[j].poscov[i] ; 
covf_A << genfinf.mapfinf[j].poscov_A[i]; 
covf_C << genfinf.mapfinf[j].poscov_C[i]; 
covf_G << genfinf.mapfinf[j].poscov_G[i]; 
covf_T << genfinf.mapfinf[j].poscov_T[i]; 
firstrevf<< genfinf.mapfinf[j].first_rev[i]; 
insf << genfinf.mapfinf[j].ins[i]; 
delf << genfinf.mapfinf[j].del[i]; 
firstsf << genfinf.mapfinf[j].firstposcovsingle[i]; 

j =999; 
insertf << genfinf.insert[j]; 



//building the consensus genome 

cout << "\n ====================================== \n "; 
cout << "\n building the consensus \n "; 
cout << "\n ====================================== \n "; 



int A,G,C,T; 

for(int j=0;j < NSEG; j++) 
     { consf<<">segment_"<<j+1<<"\n"; 
      int k = 0; // for newline after 60 bp; 
       for (i =0; i <genfinf.lenght[j]; i++) 
       { 
        A=genfinf.mapfinf[j].poscov_A[i]; C=genfinf.mapfinf[j].poscov_C[i]; 
        G=genfinf.mapfinf[j].poscov_G[i]; T=genfinf.mapfinf[j].poscov_T[i]; 
        if ((A>=G)&&(A>=C)&&(A>=T)) {if (A!=0)consf<<"A"; else   consf<<"N";} 
        else if ((C>=A)&&(C>=G)&&(C>=T)) consf<<"C"; 
        else if ((G>=A)&&(G>=C)&&(G>=T)) consf<<"G"; 
        else if (((T>=A)&&(T>=G)&&(T>=C)))consf<<"T"; 
        k++; 
        if (k ==59){consf<<"\n";k=0;} 
       } 
       consf<<"\n"; 
     } 


    // closing all files 

covf.close(); 
covf_A.close(); 
covf_C.close(); 
covf_G.close(); 
covf_T.close(); 
misf.close(); 
firstf.close(); 
firstrevf.close(); 
consf.close(); 
segf.close(); 
insertf.close(); 
firstsf.close(); 
insf.close(); 
delf.close(); 



// finding mutations 


if (mutYN) 
{ 

     cout << "\n ====================================== \n "; 
     cout << "\n computing mutations \n "; 
     cout << "\n ====================================== \n "; 


     // Preparing the mutations file. 
     char * filemut = (char *)malloc(sizeof(char)*(strlen(fileroot)+9)); 
     strcpy(filemut,fileroot); 
     strcat(filemut, "_mut.txt"); 
     ofstream mutf(filemut); 

     char chrg, chcg;// Char from the reference genome, Char from the consensus genome 
     string strheader; // the first line of the reference genome file 

     ifstream refgen(filerefgen); 
     ifstream consf(filecons); 
      if (!refgen) 
         { 
           puts("Cannot open open the file") ; 
           refgen.close() ; 
           exit(0); 
         } 
      else 
        { 
       getline(refgen, strheader); 
       // read in the file without catching any non alpha caracter like space, tab, etc... 
       do {chrg = refgen.get();} while (!isalpha(chrg) && (chrg !=EOF)); 
       do {chcg=consf.get(); } while (!isalpha(chcg)&& (chcg !=EOF)); 
       int i =0; 

         while ((chrg !=EOF)&&(chcg !=EOF)) 
         { if (chrg != chcg) 
         { 
          mutf<< "Position "<< i << " : \n"; 
          mutf << "\t"<<chrg<<" by "<<chcg<<"\n"; 
         } 
         do {chrg = refgen.get();} while (!isalpha(chrg) && (chrg !=EOF)); 
         do {chcg=consf.get(); } while (!isalpha(chcg)&& (chcg !=EOF)); 
         i++; 
         } 
        } 

      cout << "\n Mutations computed \n "; 
      mutf.close(); 

    } 

    cout << "\n ====================================== \n "; 
    cout << "\n all files generated successfuly \n "; 
    cout << "\n ====================================== \n "; 


     return 0; 

}

そしてValrind出力のほんの小さな部分、最初の行:

だから、
 ==28950== Memcheck, a memory error detector 
    ==28950== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
    ==28950== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
    ==28950== Command: ./echantillon Ftooshort.sam covsam/echan1 
    ==28950== Parent PID: 1928 
    ==28950== 
    ==28950== Warning: client switching stacks? SP change: 0xbeee91f8 --> 0xbeb8b910 
    ==28950==   to suppress, use: --max-stackframe=3528936 or greater 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049000: main (echantillon.cpp:11) 
    ==28950== Location 0xbeb8b92c is 0 bytes inside local var "argv" 
    ==28950== declared at echantillon.cpp:11, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x804900D: main (echantillon.cpp:11) 
    ==28950== Address 0xbeee91ec is on thread 1's stack 
    ==28950== 
    ==28950== Invalid write of size 1 
    ==28950== at 0x804901B: main (echantillon.cpp:20) 
    ==28950== Location 0xbeee7f8d is 0 bytes inside local var "mutYN" 
    ==28950== declared at echantillon.cpp:12, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x8049022: main (echantillon.cpp:21) 
    ==28950== Location 0xbeb8b92c is 0 bytes inside local var "argv" 
    ==28950== declared at echantillon.cpp:11, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x804902D: main (echantillon.cpp:21) 
    ==28950== Address 0xbeb8b910 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x402A225: strlen (mc_replace_strmem.c:390) 
    ==28950== by 0x8049034: main (echantillon.cpp:21) 
    ==28950== Location 0xbeb8b910 is 0 bytes inside local var "str" 
    ==28950== declared at mc_replace_strmem.c:390, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049038: main (echantillon.cpp:21) 
    ==28950== Address 0xbeb8b910 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x4029149: operator new[](unsigned int) (vg_replace_malloc.c:343) 
    ==28950== by 0x804903F: main (echantillon.cpp:21) 
    ==28950== Location 0xbeb8b910 is 0 bytes inside local var "n" 
    ==28950== declared at vg_replace_malloc.c:343, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049040: main (echantillon.cpp:21) 
    ==28950== Location 0xbeee7f18 is 0 bytes inside local var "filemap" 
    ==28950== declared at echantillon.cpp:14, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x8049046: main (echantillon.cpp:22) 
    ==28950== Location 0xbeb8b92c is 0 bytes inside local var "argv" 
    ==28950== declared at echantillon.cpp:11, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049051: main (echantillon.cpp:22) 
    ==28950== Address 0xbeb8b910 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x402A225: strlen (mc_replace_strmem.c:390) 
    ==28950== by 0x8049058: main (echantillon.cpp:22) 
    ==28950== Location 0xbeb8b910 is 0 bytes inside local var "str" 
    ==28950== declared at mc_replace_strmem.c:390, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x804905C: main (echantillon.cpp:22) 
    ==28950== Address 0xbeb8b910 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x4029149: operator new[](unsigned int) (vg_replace_malloc.c:343) 
    ==28950== by 0x8049063: main (echantillon.cpp:22) 
    ==28950== Location 0xbeb8b910 is 0 bytes inside local var "n" 
    ==28950== declared at vg_replace_malloc.c:343, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049064: main (echantillon.cpp:22) 
    ==28950== Location 0xbeee7f1c is 0 bytes inside local var "fileroot" 
    ==28950== declared at echantillon.cpp:15, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x804906A: main (echantillon.cpp:23) 
    ==28950== Location 0xbeb8b92c is 0 bytes inside local var "argv" 
    ==28950== declared at echantillon.cpp:11, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049075: main (echantillon.cpp:23) 
    ==28950== Address 0xbeb8b914 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x8049079: main (echantillon.cpp:23) 
    ==28950== Location 0xbeee7f18 is 0 bytes inside local var "filemap" 
    ==28950== declared at echantillon.cpp:14, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x804907F: main (echantillon.cpp:23) 
    ==28950== Address 0xbeb8b910 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x402A269: strcpy (mc_replace_strmem.c:429) 
    ==28950== by 0x8049086: main (echantillon.cpp:23) 
    ==28950== Location 0xbeb8b914 is 0 bytes inside local var "src" 
    ==28950== declared at mc_replace_strmem.c:429, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x402A26C: strcpy (mc_replace_strmem.c:429) 
    ==28950== by 0x8049086: main (echantillon.cpp:23) 
    ==28950== Location 0xbeb8b910 is 0 bytes inside local var "dst" 
    ==28950== declared at mc_replace_strmem.c:429, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x8049087: main (echantillon.cpp:24) 
    ==28950== Location 0xbeb8b92c is 0 bytes inside local var "argv" 
    ==28950== declared at echantillon.cpp:11, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049092: main (echantillon.cpp:24) 
    ==28950== Address 0xbeb8b914 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x8049096: main (echantillon.cpp:24) 
    ==28950== Location 0xbeee7f1c is 0 bytes inside local var "fileroot" 
    ==28950== declared at echantillon.cpp:15, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x804909C: main (echantillon.cpp:24) 
    ==28950== Address 0xbeb8b910 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x402A269: strcpy (mc_replace_strmem.c:429) 
    ==28950== by 0x80490A3: main (echantillon.cpp:24) 
    ==28950== Location 0xbeb8b914 is 0 bytes inside local var "src" 
    ==28950== declared at mc_replace_strmem.c:429, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x402A26C: strcpy (mc_replace_strmem.c:429) 
    ==28950== by 0x80490A3: main (echantillon.cpp:24) 
    ==28950== Location 0xbeb8b910 is 0 bytes inside local var "dst" 
    ==28950== declared at mc_replace_strmem.c:429, in frame #0 of thread 1 
    ==28950== 

    // And many others almost 30 per each mentioning char * or file I mean fileroot, filemap, filecons, filedes, and so on. 

    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x804D29C: std::operator|(std::_Ios_Openmode, std::_Ios_Openmode) (ios_base.h:122) 
    ==28950== by 0x8049867: main (echantillon.cpp:99) 
    ==28950== Location 0xbeb8b914 is 0 bytes inside local var "__b" 
    ==28950== declared at ios_base.h:121, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049868: main (echantillon.cpp:99) 
    ==28950== Address 0xbeb8b918 is on thread 1's stack 
    ==28950== 
    ==28950== Invalid read of size 4 
    ==28950== at 0x804986C: main (echantillon.cpp:99) 
    ==28950== Location 0xbeee7f3c is 0 bytes inside local var "filecov" 
    ==28950== declared at echantillon.cpp:52, in frame #0 of thread 1 
    ==28950== 
    ==28950== Invalid write of size 4 
    ==28950== at 0x8049872: main (echantillon.cpp:99) 
    ==28950== Address 0xbeb8b914 is on thread 1's stack 

、誰もがこの問題を整理するために私を助けることができるしてください?

答えて

2

valgrindのdocsから:

警告:クライアントがスタックを切り替えますか?

Valgrindはスタックポインタの大きな変化を発見したので、 はクライアントが別のスタックに切り替わっていると推測します。この時点で、 は、新しいスタックのベースがどこにあるかを推測し、それに応じてメモリのアクセス権を に設定します。 Valgrindが間違っていると思われる場合は、これに続いて多くの偽のエラーメッセージ が表示されることがあります。現時点では、 " 変更が大きい"とは、スタックポインタレジスタ の値が2000000以上変化したものと定義されている。

これを最初に修正し、その後のエラーが消えるかどうか確認してください。ログには、すでにそれを修正する方法が記載されています。

そのはあなたの問題を解決しない場合は、それを再現する最小限コンパイルコードを投稿してください - 上記のあなたのOPは巨大であり、ほとんど無関係に見えます。

+0

非常に役に立たなかった、無限の量のエラーの問題でした。それがバグのパラメータの問題でした。私のプログラムのバグに移行しましょう。 –

+0

私はvalgrindを使うことができるので、最初に自分でデバッグしようとします。他の問題がある場合、私はここでカムバックすることができます。ありがとう –

+0

私には正しいアプローチのように聞こえる - 問題はなく、幸運。 – Useless

関連する問題