본문 바로가기

분류 전체보기

(711)
Segmentation fault 상황 사례 [1. 개요]아래 세그멘테이션 폴트 사례는 오염 된 포인터 변수에 접근 시 발생함.엄밀하게 말하면 스택 오버플로우가 아니기 때문임.[2. 예제]#include #define MAX_LEN 5struct A { int arr[MAX_LEN]; int len;};class MyContainer {private: // 메모리 배치를 고려하면... A first; const int *bptr; const char *cptr; const float *dptr;public: MyContainer() { first.len = 0; bptr = new int[MAX_LEN]; cptr = new char[MAX_LEN]; dp..
리눅스. 스택 크기에 관한 고찰 [1. 개요]Segmentation fault 와 관련하여 고민한 내용 정리[2. 상황]특정 함수 진입 시, c++ 로 작성한 애플리케이션이 segmentation fault 발생과 함께 죽는 현상.gdb 로 디버깅 시, 함수 진입 만 하였는데, segmentation fault 가 발생. 의심이 것 중 하나는 스택 오버플로우..[3. 예제] 1 #include 2 3 4 void myfunc() 5 { 6 char arr[MYSZ * 1024 * 1024]; 7 std::cout  ulimit -s 가 8192 (8 Mbyte 인 경우)g++ main.cpp -g -DMYSZ=9g++ main.cpp -Wl,-z,..
gdb 사용 방법 (기초) [1. 개요]리눅스 C++ application 디버깅 시, 유용한 툴 인 gdb 의 기초적인 사용 방법을 정리한다. 기본적으로 breakpoint 를 걸고, 한줄 단위로 실행해보기 위해서 디버깅 심볼들이 필요하다.따라서, CMake 기준에서는최적화를 많이 하는 Release 빌드 보다는 Debug 빌드가 적합하다.아래와 같이, gdb 실행 시 심볼들을 찾을 수 없다는 메시지가 출력 된다. g++ 로 직접 빌드하는 경우라면, -g 옵션을 사용하고, 최적화는 하지 않도록 한다.[2. 기본적인 실행] 1 #include 2 3 int sum(const int a, const int b) 4 { 5 const int aa = a*a; 6 ..
[C++] 리눅스 System V 공유메모리 [1. 개요]리눅스 공유메모리의 한 종류인 System V 공유메모리의 간단한 사용 방법 및유의 사항을 정리하도록 한다.[2. 생성]#include #include #include #include int main(){ const int id = shmget(0x12345678, 4096, IPC_CREAT | IPC_EXCL | 0666); // 할당할 메모리 공간의 크기 // 생성, 이미 존재하면 실패, 접근 권한 if (id == -1) { perror("shmget fail"); return 1; } // 공유메모리 세그먼트에 attach voi..
Segmentation fault 사례 [1. 개요]C++ 코드 작성 시, 발생한 segmentation fault 사례 및 해결 방안 정리[2. 예제]#include #include #include #include struct MyStruct { long long a; int b; char c[32]; std::string d;};std::deque dq;void GetAndErase(MyStruct& ref){ if (dq.size() > 0) { ref = dq.back(); // seg fault 가 발생하는 순간. dq.pop_back(); }}int main(){ { MyStruct item; strcpy(item.c, "Hello_World")..
git 명령어 정리 [1. git mv]git 으로 추적 하는 파일에 대해서, 해당 파일 이름을 변경 할 경우 유용하게 사용 할 수 있다.어떤 파일의 이름을 mv 명령어를 이용하여 A -> B 로 수정하면, A 라는 파일을 삭제하는 것으로 처리됨.특히, B 라는 untrack 된 파일을 다시 commit 해야하는 과정을 추가로 처리해야함.그러나, git mv A B 로 하면, A 에서 B 로 이름이 변경된 것으로 처리하게 된다.[2. git reset]git add 로 stage 에 올라간 파일을 stage 에서 내릴 때에 사용 할 수 있다.git reset HEAD "your_file_name"[3. git restore]특정 파일의 변경 사항을 폐기 할 수 있다.git restore "your_file_name"
Socket, 멀티 캐스트 & 브로드 캐스트 [1. 개요]멀티 캐스트(Multicast) 통신에서 데이터 전송은 특정 그룹에 등록되어 있는 다수의 호스트를 대상으로 한다.즉, 한번에 전송으로 다수의 호스트가 이를 수신 할 수 있다는 것이다. 이러한 멀티 캐스트 통신은 UDP 를 기반으로 하며, 라우터의 도움이 필요하다.라우터가 패킷을 복사하여 다수의 호스트에 이를 전달.라우터가 멀티 캐스트를 지원하지 않을 수 도 있다.특정 그룹은 클래스 D 에 속하는 IP 주소를 대상으로 한다.224.0.0.0 ~ 239.255.255.255브로드 캐스트(Broadcast) 통신 역시 UDP 를 기반으로하며, 멀티 캐스트와 유사하나, 전송 범위에서 그 차이가 있다.동일 네트워크에 속해있는 호스트로 그 대상이 제한된다.또한, 브로드 캐스트 통신이라 하더라도 IP 주..
Segmentation fault 해결 (C++) [1. 개요]C++ application 에서 발생한 Segmentation fault(Core dumped) 오류 해결 사례[2. 원인]재귀 함수의 recursion 이 깊어지는 경우 주로 발생했는데,아래 컴파일 경고가 발생한 함수에서 런타임 오류가 발생waring: control reaches end of non-void function [3. 해결]해당 함수의 리턴은 딱히 쓰는 데가 없어서 함수의 return type 을 void 로 바꿈.[4. 결론]함수의 리턴 값을 정확히 명시하지 않는 경우, 최악의 상황에서 app 이 crash 가 발생할 수 있다.
윈도우 컴파일 에러. [No Target Architecture] [1. 개요]윈도우 System api 를 사용해서, c++ application 소스 코드 작성 후, cmake 를 이용하여, 윈도우 visual studio 빌드 환경을 구축하였다. 컴파일을 진행 하니, Fatal error: "No Target Architecture" 가 발생하면서, 컴파일 실패함.[2. 해결 방법]여러가지 솔루션들이 있었으나, 나의 경우#include 를 다른 윈도우 api header 보다 먼저 include 하는 것 이었다.// Before#include #include #include /*****/ // After#include /*****/#include #include  그 외 부가적으로, CMAKE_GENERATOR_PLATFORM 를 x64 로 명시WIN32_L..
소켓 Linger 옵션 [1. 개요]C++ 를 이용하여 서버 프로그램 작성 시, accept 된 소켓 (이하 클라이언트 소켓) 과 통신 시 발생한 문제서버: send() 후, 클라이언트 소켓에 대해서 close() 함클라이언트:  서버로 부터 응답을 받지 못하고, connection reset 이 발생서버: close() 전, shutdown() 을 이용해서 출력 스트림만 종료하여 출력 버퍼가 비워지도록 수정.클라이언트:  서버 응답 패킷 크기가 작은 경우는 응답을 받았지만, 패킷 크기가 큰 경우는 여전히 동일한 문제가 발생위와 같은 문제의 원인은, 클라이언트 소켓을 대상으로 close() 한 것이 문제인데,보통 file descriptor (text 파일 같은 것) 를 대상으로 close() 를 호출하면 출력 버퍼가 비워진다..