0

こんにちは、デバッグの概念を学んでいます。このプログラムでは、コア ダンプをシミュレートしようとしています。コアがダンプされることを期待していますが、コアを生成していません。プログラムは問題なく実行されます。

まず、ptr に 20 バイトを割り当てます。新しい文字列を 1 つ ptr にコピーします。次に、ptrを解放し、pblmなしで機能するptrを印刷します。最後に、今回はコア ダンプが生成される可能性があると思われる他の文字列を再度割り当てます。しかし、私はコアダンプを取得しませんでした。コアダンプが生成されない理由を誰でも説明できますか。

int main()
{
   char *ptr;
   ptr =(char*)  malloc (20);
   strcpy(ptr,"MemoryOperations");
   printf("Before Free memory : %s\n",ptr);
   free(ptr);
   printf("After Free memory : %s\n",ptr);
   strcpy(ptr,"MemReassign");
   printf("After Re Assigning : %s\n",ptr);
   return 0;
}

dbx を使用して実行する同じコード、

(dbx) check -all
access checking - ON
memuse checking - ON
(dbx) run
Running: a.out 
(process id 19081)
RTC: Enabling Error Checking...
RTC: Running program...
Before Free memory : MemoryOperations
Read from unallocated (rua):
Attempting to read 1 byte at address 0x100101a48
which is 2232 bytes into the heap; no blocks allocated
stopped in _ndoprnt at 0xffffffff671abbf0
0xffffffff671abbf0: _ndoprnt+0x1c04:    call     _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20
(dbx) exit
4

2 に答える 2

3

メモリが解放された後にメモリに書き込むと、何かが起こる可能性があります。未定義の動作です。コア ダンプを取得することも、取得しないこともできます。あなたの場合、メモリが解放されたとしても、プロセスからアクセスできるため、コアダンプは取得されません。mallocただし、ステートメントの直前に 別の操作を行っreturn 0てそのメモリに書き込むと、文字列 "After Re Assigning ..." が上書きされる可能性が高くなります。

dbxprintf("After Free memory : %s\n",ptr);を使用すると、アクセス チェックを有効にしているため、このステートメントは "Read from unallocated" エラーを生成しますが、dbx を使用しない場合、アクセス チェックはまったく行われません。

コア ダンプをシミュレートするには、次のようにします。

void main()
{
  char *p = NULL ;
  *p = 'A' ;
}

これにより、ほとんどのプラットフォームでクラッシュします。

于 2014-02-27T09:38:14.530 に答える