C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

CおよびC++でセグメンテーションエラーを見つける方法は? (GDBを使用)


セグメンテーションエラーは、無効な配列インデックスへのアクセス、制限されたアドレスの指定など、メモリアクセス違反が原因で発生するランタイムエラーの1つです。この記事では、GDBツールを使用してこのタイプのエラーを検出する方法を説明します。 。

エラーを見つけるためのコードとそれぞれの手順を見てみましょう。

#include <stdio.h>
main() {
   int* ptr = NULL;
   *ptr = 1; //trying to access unknown memory location
   printf("%p\n", ptr);
}

「gcc–g program_name.c」を使用してコードをコンパイルし、「。/a.out」を使用して実行します

出力

soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ ./a.out
Segmentation fault (core dumped)

セグメンテーションエラーが発生しました。

「gdb./a.outcore」と書く

soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ gdb ./a.out core
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<https://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
/home/soumyadeep/Cpp_progs/core: No such file or directory.
(gdb)

「r」と入力してEnterキーを押します。

Starting program: /home/soumyadeep/Cpp_progs/a.out

Program received signal SIGSEGV, Segmentation fault.
0x000055555555465e in main () at 1230.find_seg_error.c:5
5 *ptr = 1; //trying to access unknown memory location
(gdb)

エラーが正常に発生したので、GDBを終了します

(gdb) quit
A debugging session is active.

Inferior 1 [process 2794] will be killed.

Quit anyway? (y or n) y

  1. C ++を使用してOpenCVで線を引く方法は?

    線を引くには、始点と終点の2つの点が必要です。線を引くためのキャンバスも必要です。 キャンバスのマトリックスであるOpenCVを使用して、ラインの開始点と終了点を定義する必要があります。線にも色を付ける必要があります。線の太さも説明する必要があります。 OpenCVを使用して線を描画する場合は、マトリックス、2つのポイント、および色と線の太さを宣言する必要があります。 OpenCVを使用するには、 を含める必要があります line()のためのヘッダー 関数はこのヘッダーで定義されています。 このメソッドの基本的な構文は次のとおりです- 構文 line(whiteMatrix, star

  2. C ++プログラムを使用してプログラムを起動するにはどうすればよいですか?

    ここでは、メモ帳などのサードパーティアプリケーションやC++プログラムを使用したものを起動する方法を説明します。このプログラムは非常に単純で、コマンドプロンプトコマンドを使用してこのタスクを実行できます。 system()関数内でアプリケーション名を渡します。これにより、それに応じて開きます。 例 #include <iostream> using namespace std; int main() {    cout >> "Opening Nodepad.exe" >> endl;    sy