web-dev-qa-db-ja.com

不正なコンパイルコマンドで上書きされたソースを回復するにはどうすればよいですか?

C++のソースコードを作成し、次のコマンドラインを使用して同じ名前でコンパイルしました。

例:

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

これで、ソースコードが実行可能プログラムに置き換えられました。ソースコードを取得する方法はありますか。 Linuxは初めてなので、元に戻す方法があるかどうかわかりません。終わったよ。

8
Pavitar

おそらくそうではありません、ソース管理を試してみてください?


幸運にも、エディタを開いたり、スクロールバック付きのターミナルウィンドウを開いたりすることができます。

また、馬がボルトで固定された後の納屋のドアをロックする部門では、おもちゃのプログラムで作業している場合でも、ソースコード管理を使用することをお勧めします。

gitまたはのいずれかを使用するhg、あなたはすることができます

$ 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
15
DigitalRoss

オプション -oは出力ファイルを指定します。そのため、ソースコードは上書きされました。

あなたは使うべきだった

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

コンパイルされたファイルからoriginalソースを取得することに関して:いいえ、できません。あなたはそれを逆アセンブルすることができます(それであなたのプログラムのアセンブリバージョンを手に入れてください)そしてそれからいくつかの「C++スタイル」コードを書き直す小さなプログラムがそこにあると確信しています、しかしそれはあなたの元のコードのようになることは決してありませんC++の1つの命令は、同じマシンコードに対応する場合があります。

7
nico

どのエディタを使用しましたか。 Vimなどを使用している場合は、おそらくsource-code.cpp〜バックアップファイルがある可能性があります。

6
user51248

おっと...あなたは運が悪いです。

まず第一に:削除されたファイルがあったファイルシステムをすぐにアンマウントします。これにより、削除されたファイルのデータが復元の手順を実行しているときに上書きされるリスクが最小限に抑えられます。 削除されたファイルを含むファイルシステムに書き込まれたすべてのデータ(ユーザーまたはマシンで実行されている他のプロセスによって)は、回復したいデータの一部を上書きする可能性があります!

詳細はこちら: http://e2undel.sourceforge.net/recovery-howto.html

2
kartheek

いくつかのディスク回復ツールを試してみてください。新しいファイルが元のファイルと同じブロックに書き込まれていない可能性があります。私はここで大声で考えているだけですが、あなたがこれを試してみたほうがいいです。ところで、どのエディタを使用していますか?エディタがすべてのファイルの自動バックアップを作成するかどうかを確認しましたか?

2
6pack kid

Viセッションをまだ閉じていない可能性が非常に低い場合は、新しいターミナルを開いて、同じフォルダーで.source-code.cpp.swpファイルを探します。ピリオドで始まるファイルは、デフォルトではlsコマンドによってリストされないことに注意してください。 ls -Aを使用してそれらを表示します。

.swpファイルの最後の行には、不正なコンパイルによって破損する前の元のファイルのテキストが含まれています。

私の元のファイルtest.cpp

#include <iostream>
using namespace std;

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

私の.test.cpp.swpの最後の部分(この場合、1つの巨大な行が含まれていました)。

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

Viセッションを閉じると、.swpファイルは削除されます。したがって、すでに閉じている場合は、運が悪いことになります。

1
Amarghosh

いいえ、Linuxを介してアクションを元に戻せない限り、ソースコードは失われます。おそらく別の名前にコンパイルする必要があります。

ソースコードを逆コンパイルすることはできません。

0

不可能だとは言いません。 FBIはおそらく、運の大きな山積みの助けを借りて、その一部を取り戻すことができます。ただし、実行可能ファイルは確かにソースよりも大きいため、すべてを上書きしました。

これが、バージョン管理システムを使用する必要がある理由の1つです。 SVNをチェックしてください

0
JoshD

@ jase21が述べたように、vimまたはgeditを使用した場合、バックアップを含むsource.cpp~ファイルがあります。

emacsには#source.cpp#ファイルがあります。

どのテキストエディタを使用しましたか?簡単に言えば、何行のコードが失われましたか?

0
Karthick