Bozuk bir derleme komutu ile üzerine yazılan kaynağı nasıl kurtarabilirim?


8

C ++ kaynak kodunu yazdım ve aşağıdaki komut satırını kullanarak aynı adla uydum.

Örneğin:

c++ source-code.cpp -o source-code.cpp

Şimdi kaynak kodum çalıştırılabilir program tarafından değiştirildi. Kaynak kodumu almamın bir yolu var mı? Linux'ta yeniyim, bu yüzden yaptığım şeyi geri almanın bir yolu olup olmadığından emin değilim.


22
Oh Myyy .. Bu, kaynak kontrolünü neden kullandığımızın harika bir örneği.

2
SO için OT olduğundan, süper kullanıcıya geçmek için oy kullanma. Seni Pavitar için hissediyorum.
Ben Voigt,

1
@JoshD: Kaynak kontrolü, kontrol ettiğiniz, yüzlerce değişiklik yaptığınız ve kontrol etmeden önce test etmek için derlediğiniz durumda yardım etmemiş olabilir (kural numarası 1: yapıyı asla bozmaz). İstediğim şey VMS'nin günleri, her dosyanın değiştirildiği her zaman sürümünün sürümleri ve kaynağını kurtarmak için yalnızca bir sürümü yedekleyebildiğiniz günler.

@ paxdiablo: çok doğru. Bu durumda, her kaydetme işleminde .bak dosyalarında otomatik olarak yedekleme yapan bir metin düzenleyici kullanın :) Günlük kaydı dosya sistemleri tarzınıza geliyor gibi görünüyor. Bence elma bilgisayarları tam da bu yeteneğe sahip.

4
@ paxdiablo: Bu nedenle, değişiklikleriniz sabitlendikten sonra birleştiğiniz gelişim kollarına sahipsiniz. (Ahem. Bu yüzden test edilmiş-iyi derleyici ifadeleriyle Makefiles'e
sahipsin

Yanıtlar:


15

Muhtemelen hayır, kaynak kontrolünü deneyin?


Bir editörün açık olması ya da kaydırma özelliğine sahip bir terminal penceresi olması için yeterince şanslısınız.

Ve ahırdan sonra kapıyı kilitlemiş olan attan sonra kilitlenen bölümde, oyuncak programlarında çalışırken bile iyi bir geliştirme uygulaması kaynak kodu kontrolünü kullanmaktır.

Ya kullanma budala ya hg , yapabileceğiniz

$ hg init
$ hg add source.cpp
$ hg commit -m 'change' source.cpp
$ # edit here, and you can optionally revert to the original
$ hg commit -m 'change' source.cpp
$ # now if you clobber it you can go back to one of the previous revisions

7

Seçenek -oçıkış dosyasını belirtir, bu yüzden kaynak kodun üzerine yazılmıştır.

Kullanmalıydın

c++ source-code.cpp -o executable-name

Orijinal kaynağı derlenmiş dosyadan almak için : hayır yapamazsınız. Demonte edebilirsiniz (programınızın bir montaj versiyonunu edinin) ve orada bazı "C ++ stil" kodlarını tekrar yazacak küçük bir program olduğundan eminim, fakat bu orijinal kodunuzdan daha fazlası olmayacak C ++ 'daki bir komut aynı makine koduna karşılık gelebilir.


Sadece kullanabilirsiniz: "g ++ dosyaadı.cpp" ve "./a.out" ile çalıştırın. Kodu geri alabileceğiniz IDAPro (veya başka bir güçlü sökme cihazı) kullanarak sökebilirsiniz.

@ jase21: elbette, ama muhtemelen a.outşimdiye kadarki en iyi dosya adı değil :). IDAPro, ORİJİNAL kodunu yine de kurtarmaz.

6

Hangi editörü kullandın? Büyük olasılıkla Vim veya bir şey kullanıyorsanız source-code.cpp ~ yedekleme dosyası olabilir.


@ jase21 - Vi editörü kullanıyordum. teşekkür ederim
Pavitar

@Pavitar Yani kesinlikle bir yedekleme olacak. Buldun mu?

NO. sanırım Vi editörü bir yedekleme oluşturmuyor.
Pavitar


2

Hata! Şansınız yaver gitti.

Her şeyden önce: Derhal silinen dosyanın bulunduğu dosya sistemini açın. Bu, onları kurtarmak için adımlar atarken, silinen dosyanın verilerinin üzerine yazılma riskini en aza indirir. Sizin tarafınızdan veya makinenizde çalışan herhangi bir işlem tarafından silinmiş dosyayı içeren dosya sistemine yazılan tüm veriler, kurtarmak istediğiniz verilerin bir kısmının üzerine yazabilir!

burada daha fazla: http://e2undel.sourceforge.net/recovery-howto.html


2

Bazı disk kurtarma aracı deneyin belki yeni dosya orijinal ile aynı bloklarda yazılmamış. Ben sadece burada yüksek sesle düşünüyorum, ama bu bir atış verdi daha iyidir. BT hangi editörü kullanıyorsunuz? Editörünüzün her dosyanın otomatik bir yedeğini oluşturup oluşturmadığını kontrol ettiniz mi?


1

Henüz vi seansınızı kapatmadıysanız, yeni bir terminal açın .source-code.cpp.swpve aynı klasörde bir dosya arayın . Bir nokta ile başlayan dosyaların lsvarsayılan olarak komutla listelenmediğini unutmayın; ls -Aonları görmek için kullanın .

.swpDosyanın son satırında, hatalı derlemeyle bozulmadan önce orijinal dosyanızdaki metin bulunur.

Orijinal dosyam test.cpp

#include <iostream>
using namespace std;

int main()
{
        cout << "Hello World!" << endl;
        cout << "Let us C";
}

Benim son parçası .test.cpp.swp(bu durumda, tek bir büyük çizgi içeriyordu).

@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
@^@^@^cout << "Let us C";^@   cout << "Hello World!" << endl;^@{^@int main()^@^@using namespace std;^@#i    nclude <iostream>^@

.swpEğer vi oturumu kapattığınızda dosya silinmiş olsun; bu yüzden zaten kapattıysanız, şansınız kalmaz.


0

hayır, eyleminizi Linux üzerinden geri alamazsanız, kaynak kodunuz kaybolur. Muhtemelen farklı bir isimle derlemeliydin.

Kaynak kodunuzu ters derleyemezsiniz.


Ayrıştırma mümkündür, ancak orijinal kaynak kodunu döndürmez.
Ben Voigt,

Muhtemelen çok az anlam ifade edecektir.

0

İmkansız olduğunu söylemeyeceğim. FBI muhtemelen şansın bir kısmını büyük bir yığın yardımı ile geri alabilir. Ancak çalıştırılabilir programınız kesinlikle kaynağınızdan büyük olduğundan, hepsinin üzerine yazdınız.

Bu, sürüm kontrol sistemi kullanmanızın sebeplerinden biridir. SVN'ye göz atın .


0

@ Jase21'de belirtildiği gibi, kullandıysanız vimveya kullandıysanız gedit, source.cpp~yedeğini içeren bir dosya olacaktır .

emacsbir #source.cpp#dosya olacak .

Hangi metin editörünü kullandın? Daha hafif bir kayda göre, kaç satır kod kaybetti?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.