Σωρός της διαφθοράς στο πλαίσιο Win32? πώς να εντοπίσετε;




Δουλεύω σε ένα **multi-threaded** C ++ εφαρμογή που διαφθείρει το σωρό. Τα συνήθη εργαλεία για να εντοπίσετε αυτό το διαφθορά φαίνεται να είναι ανεφάρμοστο. Παλιά χτίζει (18 μηνών) του πηγαίου κώδικα παρουσιάζουν την ίδια συμπεριφορά με την πιο πρόσφατη έκδοση, έτσι αυτό έχει εδώ και πολύ καιρό και απλά δεν είχε παρατηρήσει? καθοδικοί, δέλτα πηγή δεν μπορούν να χρησιμοποιηθούν για την αναγνώριση, όταν εισήχθη το bug - υπάρχουν *πολλές* αλλαγές κώδικα στο αποθετήριο.


Η προτροπή για συντρίβεται behaviuor είναι να δημιουργήσει throughput σε αυτό το σύστημα - μεταφοράς υποδοχή δεδομένων, τα οποία munged σε μια εσωτερική αναπαράσταση. Έχω ένα σύνολο δεδομένων δοκιμής που θα προκαλέσει περιοδικά την εφαρμογή για εξαίρεση (διάφορα σημεία, διάφορες αιτίες - συμπεριλαμβανομένων σωρό αΐΐοο άλλως, έτσι: η διαφθορά σωρού).


Η συμπεριφορά φαίνεται να σχετίζονται με την δύναμη της CPU ή το εύρος ζώνης της μνήμης? η πιο καθενός η μηχανή έχει, τόσο πιο εύκολο είναι να συντριβή. Απενεργοποίηση μια υπερ-threading πυρήνα ή ένα διπλού πυρήνα πυρήνα μειώνει τον ρυθμό (αλλά δεν εξαλείφει) διαφθορά. Αυτό υποδηλώνει ένα θέμα σχετικό χρονοδιάγραμμα.


Τώρα εδώ είναι το πρόβλημα:   

Όταν είναι τρέχει σε περιβάλλον ελαφρύ debug (ας πούμε `Visual Studio 98 / AKA MSVC6`) η αλλοίωση σωρού είναι αρκετά εύκολο να αναπαραχθούν - δέκα ή δεκαπέντε λεπτά περνούν πριν κάτι αποτύχει τρομερά και εξαιρέσεις, όπως ένα `alloc;`όταν τρέχει κάτω από ένα εκλεπτυσμένο περιβάλλον εντοπισμού σφαλμάτων (Rational καθαρίζονται, `VS2008/MSVC9`ή ακόμα και Microsoft Application ελέγχου) το σύστημα γίνεται δεσμευμένη μνήμη ταχύτητας και δεν συντριβή (μνήμη-δεσμεύεται: CPU δεν παίρνει παραπάνω `50%`, το φως δίσκος δεν είναι ενεργοποιημένη, το πρόγραμμα πρόκειται όσο πιο γρήγορα μπορεί, κιβώτιο καταναλώνει `1.3G`των 2G μνήμη RAM) . Έτσι, **έχω μια επιλογή μεταξύ του να είναι σε θέση να αναπαράγει το πρόβλημα (αλλά όχι προσδιορίσει την αιτία) ή να είναι σε θέση να idenify την αιτία ή ένα πρόβλημα που δεν μπορούν να αναπαραχθούν.**


τρέχουσες καλύτερες εκτιμήσεις μου για το πού να επόμενο είναι:


1. Πάρτε μια εξωφρενικά Γκράντι παράθυρο (για να αντικαταστήσει το τρέχον πλαίσιο dev: 2Gb RAM σε ένα `E6550 Core2 Duo`)? Αυτό θα καταστήσει δυνατή την repro τη συντριβή προκαλώντας κακή συμπεριφορά κατά την εκτέλεση κάτω από ένα ισχυρό περιβάλλον debug? ή
2. Ξαναγράψτε φορείς `new`και `delete`να χρησιμοποιούν `VirtualAlloc`και `VirtualProtect`να σηματοδοτήσει τη μνήμη μόνο για ανάγνωση από τη στιγμή που έχει γίνει με. Εκτελέστε κάτω `MSVC6`και να έχουν το λειτουργικό σύστημα πιάσει το κακό-τύπος που γράφει για να ελευθερωθεί μνήμη. Ναι, αυτό είναι ένα σημάδι της απελπισίας: ποιοι είναι οι επανεγγραφές κόλαση `new`και `delete`;! Αναρωτιέμαι αν αυτό πρόκειται να γίνει ως αργά το πλαίσιο Καθαρίστε et al.


Και, όχι: Αποστολές με Καθαρίστε όργανα ενσωματωμένο δεν αποτελεί επιλογή.


Ένας συνάδελφος περπάτησε μόνο παρελθόν και ρώτησε «Υπερχείλιση στοίβας; Μήπως να πάρει στοίβα υπερχειλίσεις τώρα;!;»


Και τώρα, το ερώτημα: **Πώς μπορώ να εντοπίσω τη δωροδοκία σωρό;**







Ενημέρωση: εξισορρόπηση `new[]`και `delete[]`φαίνεται να έχει πάρει σε μεγάλο βαθμό στην επίλυση του προβλήματος. Αντί για 15 λεπτά, η εφαρμογή πηγαίνει τώρα περίπου δύο ώρες πριν από τη συντριβή. Δεν υπάρχουν ακόμα. Οποιεσδήποτε περαιτέρω προτάσεις; Η διαφθορά εξακολουθεί να σωρού.


Ενημέρωση: συσσώρευση απελευθέρωση κάτω από το Visual Studio 2008 φαίνεται δραματικά καλύτερα? τρέχουσα υποψία στηρίζεται στην `STL`εφαρμογή ότι τα πλοία με το `VS98`.








> 
> 3. Αναπαράγουν το πρόβλημα. `Dr Watson`θα παράγει μία χωματερή που μπορεί να είναι χρήσιμη για περαιτέρω ανάλυση.
> 
> 
> 


Θα πάρω ένα σημείωμα από αυτό, αλλά είμαι ανησυχούν ότι ο Δρ Watson θα ενεργοποιηθεί μόνο μετά το γεγονός, όχι όταν ο σωρός παίρνει πατούσαν επάνω.



> 
> Μια άλλη δοκιμή μπορεί να χρησιμοποιούν `WinDebug`ως εργαλείο εντοπισμού σφαλμάτων το οποίο είναι αρκετά ισχυρό να είναι ταυτόχρονα και ελαφρύ.
> 
> 
> 


Πήρε ότι πρόκειται αυτή τη στιγμή, και πάλι: όχι πολύ βοήθεια έως ότου κάτι πάει στραβά. Θέλω να πιάσει το βανδαλισμούς στην πράξη.



> 
> Ίσως αυτά τα εργαλεία θα σας επιτρέψει τουλάχιστον να περιορίσετε το πρόβλημα σε ορισμένες συνιστώσα.
> 
> 
> 


Δεν έχω πολλές ελπίδες, αλλά δύσκολοι καιροί απαιτούν ...



> 
> Και να είστε σίγουροι ότι όλα τα στοιχεία του έργου έχουν σωστές ρυθμίσεις βιβλιοθήκη χρόνου εκτέλεσης ( `C/C++ tab`κατηγορίας Κωδικός Παραγωγής στην VS ρυθμίσεις 6.0 του έργου);
> 
> 
> 


Όχι δεν είμαι, και θα περάσετε μια-δυο ώρες αύριο να περάσει από το χώρο εργασίας (58 έργα σε αυτό) και ο έλεγχος είναι όλοι κατάρτιση και τη σύνδεση με τις κατάλληλες σημαίες.







Ενημέρωση: Το πήρε 30 δευτερόλεπτα. Επιλογή όλων των έργων στο `Settings`παράθυρο διαλόγου, καταργήστε την επιλογή μέχρι να βρείτε το έργο (α) που δεν έχουν τις σωστές ρυθμίσεις (που όλοι είχαν τις σωστές ρυθμίσεις).
Η πρώτη μου επιλογή θα ήταν ένα ειδικό εργαλείο σωρό όπως [pageheap.exe](https://support.microsoft.com/en-us/kb/286470) .


Ξαναγράφοντας νέα και διαγραφή θα μπορούσε να είναι χρήσιμη, αλλά αυτό δεν πιάσει το allocs που διαπράχθηκαν από τον κωδικό χαμηλότερου επιπέδου. Εάν αυτό είναι ό, τι θέλετε, καλύτερα να Detour τα `low-level alloc API`s χρησιμοποιώντας το Microsoft Παρακάμψεις.


Επίσης ελέγχους υγιούς λειτουργίας όπως: επαλήθευση βιβλιοθήκες χρόνου εκτέλεσης σας αγώνα (απελευθέρωση έναντι debug, multi-threaded εναντίον του μονού νήματος, DLL εναντίον στατική lib), αναζητήστε κακή διαγραφές (π.χ., διαγράψτε, όπου delete [] θα έπρεπε να είναι μεταχειρισμένα), βεβαιωθείτε ότι δεν είστε μίξη και το ταίριασμα allocs σας.


Επίσης, προσπαθήστε επιλεκτικά να απενεργοποιήσετε τα θέματα και να δούμε πότε / αν το πρόβλημα πηγαίνει μακριά.


Τι σημαίνει η στοίβα κλήσεων κλπ μοιάζουν κατά το χρόνο της πρώτης εξαίρεση;
Θα χρησιμοποιηθεί για να πάρει αυτό - νομίζω ότι είναι ένα bug με το παράθυρο εντοπισμού σφαλμάτων «Autos»:


[http://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/eabc58b1-51b2-49ce-b710-15e2bf7e7516/](https://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/eabc58b1-51b2-49ce-b710-15e2bf7e7516/) Θα πρέπει να δώσετε περισσότερες πληροφορίες σχετικά με το περιβάλλον ανάπτυξής σας για να πάρετε μια συγκεκριμένη απάντηση.


Για παράδειγμα, με ένα C # έργο στο Visual Studio, μπορείτε να κάνετε δεξί κλικ στα Project-> Ιδιότητες και, στη συνέχεια, να συμπληρώσετε το πεδίο «Εντολή επιχειρήματα γραμμή» στην καρτέλα «Debug». Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). Αυτό λειτουργεί στον υπολογιστή μου (TM) μετά την εγκατάσταση rdbgsetup\_x64.exe και να περάσει από τον οδηγό διαμόρφωσης:



```
sc stop msvsmon90
sc config msvsmon90 binPath= "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger\x86\msvsmon.exe /service msvsmon90"
sc start msvsmon90

``` μετά από πληροφορίες που βρήκα το έφτιαξα,

γενικά το κατάλαβα αμέσως όταν έκανα την βλακεία και δεν έκλεισα τον υπολογιστή. οπότε είχα διαθέσιμο τον υπολογιστή μου για την επιδιόρθωση αφού το λειτουργικό ήταν φορτομένο στη ram. έχουμε και λέμε:

με την εφαρμογή disks. ξαναδημιούργησα το partition… Ενώ μόδας, η λέξη-κλειδί κόλπο αναθεώρηση ενημερώνει μόνο το αρχείο όταν έχει αλλάξει σε αυτή την αναθεώρηση - αν δεν αλλάξει το αρχείο, τότε θα συνεχίσει να αντικατοπτρίζει την παλιά αναθεώρηση.


Αν θέλετε το λογισμικό να αντανακλά πάντα το συνολικό αριθμό αναθεώρησης, τότε θα πρέπει να σκαλίζω το [σχετικό SVN καταχωρήσεις αρχείο](http://svnbook.red-bean.com/en/1.1/ch08s03.html) και αποσυμπιέστε το, το οποίο δεν είναι πάρα πολύ δύσκολο (αυτό είναι ένα αρχείο XML).


Wikipedia το κάνει αυτό στη [σελίδα τους εκδοχή](https://en.wikipedia.org/wiki/Special:Version) για να δείξει την αναθεώρηση του λογισμικού που τρέχει ζωντανά? [ο κώδικας είναι εδώ](https://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3/includes/specials/SpecialVersion.php) - αναζητήστε το **getSvnRevision ()** μέθοδο. [[spoty\_error]](https://linux-user.gr/uploads/default/original/2x/c/cd930976994c2ed8f6fd03b7787efd2cd4fd9371.png "spoty_error")

έσβησα τα “κλειδιά” αλλά δεν… το πρόβλημα παραμένει!

edit: τελικά [εδώ](https://community.spotify.com/t5/desktop-linux/an-error-occurred-during-the-signature-verification/m-p/5047755#m19979) βρέθηκε η λύση… δείχνει πως είναι οκ τώρα!

ευχαριστώ!!! μπορείς να σβήσεις αυτά τα αρχεία. στην συνέχει μπες στο σύστημα και εγκατέστησε το πακέτο logrotate και δεν θα ξανασυμβεί. κανονικά θε έπρεπε να ήταν εγκατεστημένο.

για περισσότερα

[εικόνα]

[log files: καταγραφές, ρουφιάνοι και ανακύκλωση](https://cerebrux.net/2018/08/09/log-files-%ce%ba%ce%b1%cf%84%ce%b1%ce%b3%cf%81%ce%b1%cf%86%ce%ad%cf%82-%cf%81%ce%bf%cf%85%cf%86%ce%b9%ce%ac%ce%bd%ce%bf%ce%b9-%ce%ba%ce%b1%ce%b9-%ce%b1%ce%bd%ce%b1%ce%ba%cf%8d%ce%ba%ce%bb%cf%89/)

μας παρακολουθούν… όχι εκεί έξω… αλλά ο ίδιος σου… τελικά επανέφερα το / με το timeshift και βρήκα την λύση εδώ:

[εικόνα]

[how to prevent the .xsession-errors file from growing to a huge size |...](https://www.daniloaz.com/en/how-to-prevent-the-xsession-errors-file-from-growing-to-huge-size/)

the .xsession-errors file is where the x window system logs all errors that occur within the linux graphical environment. all desktop environmen… Συχνά αυτό επιτυγχάνεται με τη χρήση [«Driven δεδομένων Συνδρομές»](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , αλλά αυτή η λειτουργία είναι διαθέσιμη μόνο σε ορισμένες εκδόσεις του SQL: Enterprise και Business Intelligence, αλλά όχι στο πρότυπο.


Έτσι, υπάρχει μια σειρά από δημιουργικές λύσεις. Αλλά δεν μου αρέσει κάποια από αυτές, και απαιτούν ένα δίκαιο κομμάτι της εργασίας έξω από SSRS.


Οι λύσεις που έχω δει περιλαμβάνουν: Δημιουργία της εγγραφής και στη συνέχεια απενεργοποίηση ή επιτρέπουν την εργασία SQL που στέλνει τη συνδρομή (που προσδιορίζονται από GUID.)


Δημιουργήστε ένα .exe .NET περιτύλιγμα για να χειριστεί την αποστολή του email. Μπορεί να εκτελέσετε το ερώτημα πρώτα να δούμε πόσα επέστρεψε σειρές, και στη συνέχεια, αν χρειαστεί, να δημιουργήσει την έκθεση και να συμπεριληφθεί σε ένα email.