글

Visual Studio 2010 pdb 파일을 이용해서 디버깅 하는 방법

Visual Studio 2010에서 빌드하면서 exe 파일과 함께 pdb 파일이 생겼습니다. 디버그에 사용된다는 것 외에는 잘 모르고 있었는데, 현재 실행 중인 프로그램을 디버그 할 일이 생겨서 사용법을 찾아보았습니다. 복잡한 내용은 잘 모르겠지만, 다음과 같은 방법으로 디버깅을 시작할 수 있었습니다. 빌드하면서 생성된 exe 파일과 pdb 파일을 잘 보관합니다. (두 파일은 짝을 이룹니다.) 디버그할 exe 파일을 실행합니다. exe 파일과 같은 위치에 "1."의 pdb 파일을 복사해둡니다. Visual Studio 2010을 실행하고, 해당 프로그램의 솔루션을 엽니다. "Windows 작업 관리자"를 실행합니다. 현재 실행 중인 exe 파일의 프로세스를 찾습니다. 찾았으면, 우클릭해서 "디버그"를 선택합니다. 디버거를 연결하겠냐는 확인 창에서 "디버거 연결"을 선택합니다. 그러면 연결할 디버거를 선택하는 화면이 나타나는데, "4."에서 솔루션을 열어둔 인스턴스(Visual Studio 2010 프로그램)를 선택합니다.  ※ 만약 exe 파일과 pdb 파일이 서로 다른 빌드 때 생성된 것이라면 디버깅할 수 없습니다. 참고 Visual Studio 로 디버깅하는 방법 Debugging With Minidump

Cent OS에서 Oracle DB 12c 설치 프로그램 실행시 PRVF-0002 에러가 발생하는 문제.

본 글은 이곳 의 내용을 거의 번역한 수준입니다. Cent OS 6.5에 Oracle DB 12c를 설치하려고 오라클 사이트에서 설치 프로그램을 받아 압축을 풀고 runInstaller를 실행했습니다. 그런데... PRVF-0002 에러 메시지("로컬 노드 이름을 검색할 수 없습니다.")가 나타나더라고요... 찾아보니 다음과 같은 방법으로 간단히 해결할 수 있었습니다. 우선 호스트명을 확인해야 합니다. (터미널에서 다음 명령어를 실행합니다.) cat /etc/sysconfig/network | grep HOSTNAME (결과 예시: HOSTNAME=centosserver.dbtest) 현재 호스트 설정을 확인합니다. cat /etc/hosts (결과 예시: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ※ "1."에서 확인했던 호스트 명이 빠져 있는지 확인합니다.)   호스트 파일에 "1."에서 확인한 호스트 명을 넣어줍니다. sudo vi /etc/hosts (혹은 sudo gedit vi /etc/hosts) (예시: 127.0.0.1 centosserver centosserver.agenttest localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 centosserver centosserver.agenttest localhost localhost.localdomain localhost6 localhost6.localdomain6 ※ "1."에서 확인한 호스트 명과, 호스트 명의 앞부분(아마도 컴퓨터이름)을 넣어줍니다.) 저장하고 닫은 ...

VBoxManage로 VirtualBox의 하드디스크(vdi) 용량 증설했는데도 반영이 안되었을 때.

VirtualBox의 가상머신을 사용하던 중 가상 머신 하드디스크의 용량증설이 필요하게 되었습니다. 검색을 통해서 VirtualBox의 VBoxManage.exe를 이용해 용량을 늘리는 방법을 알아내었습니다. 그런데 용량 증설이 분명 성공했음에도 불구하고, 시스템에 반영이 안되더군요... (gparted에서 증가된 용량을 인식하지 못했습니다.) 한참 해매다가  "가상 미디어 관리자"창을 열어서 확인해보니, "스냅샷"이 원인이었음을 알 수 있었습니다. 그러니까, 저는 스냅샷의 원본의 용량을 증설한 것이고, 스냅샷 이후의 가상하드디스크(vdi파일)는 용량증설을 하지 않은 것이죠... 원본 vdi 파일이 있는 곳에 보면 "Snapshots"라는 폴더가 있고, 그 안에 스냅샷과 관련된 vdi 파일들이 있습니다. 여기서 최신의 vdi의 용량을 증설해주면 제대로 반영됩니다. 그런데.. lvm파티션(레드헷, Cent OS 등)을 사용하는 경우에는 또 다른 난관에 봉착하게 됩니다. gparted로 파티션의 용량을 조절해놓고 부팅을 했는데, 변경 사항이 반영되지 않았습니다. lvm 파티션의 경우 추가적인 조취가 필요했습니다. (다음의 명령들은 모두 관리자 권한으로 실행합니다.) 터미널에서 vgdisplay 명령을 실행합니다. 용량을 증설해야할 volume의 LV Path 항목을 찾습니다. (없는 경우에는 "df -h" 명령을 실행해서 나온 결과에 /dev/mapper/로 시작하는 항목 중 용량을 기준으로 대상을 찾습니다.) (* 제 경우에는 /dev/vg_centosserver/lv_root 였습니다.) "lvextend <LV Path 경로> -l +<용량>"을 실행합니다. (예: "lvextend /dev/vg_centosserver/lv_root -l +100%FREE" 이 명령을 실행하면 남아있는 공간만큼 ...

CRect와 &CRect와 LPCRECT

MFC 프로그래밍 중에 무척 황당한 경험을 했습니다. void CTestCRect::OnDraw(CDC* pDC) { CRect rect(50, 50, 300, 300); pDC->DrawText(_T("Test!!"), &rect, DT_WORDBREAK | DT_EDITCONTROL); rect.MoveToX(200); pDC->DrawText(_T("Test!!"), rect, DT_WORDBREAK | DT_EDITCONTROL); } 보통은 이와 같이 사용합니다. 그런데 뭔가 좀 이상하지 않나요? 네, DrawText()를 호출할 때 처음에는 rect의 주소를, 다음에는 그냥 rect를 전달합니다. 전혀 컴파일에 오류도 없고... 둘다 정상 작동합니다. 함수 원형을 살펴보면 CRect를 받는 자리에 LPRECT가 적혀 있는데, LPRECT는 (RECT 구조체의) 포인터입니다.(CRect와 RECT는 호환됩니다.) 그러니까 함수 원형만 놓고 보면 &rect로 전달하는 것이 맞습니다. 그런데 왜 rect로 전달해도 될까요? 그것은 CRect에 LPRECT에 대한 케스팅 연산자가 재정의 되어 있기 때문입니다. 그래서 LPRECT 자리에 CRect를 넣으면 CRect에 정의된 케스팅 연산자가 알아서 CRect의 주소를 반환합니다. 참고: MSDN - CRect::operator LPRECT() 클레스등에서 타입캐스트연산자 오버로딩

STL std::map 사용시 "이항 '[' : 왼쪽 피연산자로 'const std::map<_Kty,_Ty>' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다." 에러 해결법

다음의 코드를 봐주세요. class Test { /* 생략 */ Item* m_pSelectedItem; std::map<int, Item*> m_map; int Test::GetSelectedItemIndex() const; } int Test::GetSelectedItemIndex() const { for(int i = 0; i < 10; ++i) { if(m_pSelectedItem == m_map[i]) { return i; } } return -1; } 컴파일을 해보면 이상하게도 위에서 밑줄친 부분에 "이항 '[' : 왼쪽 피연산자로 'const std::map&lt;_Kty,_Ty&gt;' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다."라는 에러 메시지가 나타납니다. 한참을 해맸는데, 원인은 메서드를 const로 선언한 탓이었습니다. map의 [] 연산자는 const가 아니라서 const로 선언된 메서드에서 사용할 수 없습니다. (map[i]를 할 때, 없는 원소인 경우에는 NULL 객체를 삽입한다고 합니다.) 즉 오류를 해결하려면, "int Test::GetSelectedItemIndex() const "를 "int Test::GetSelectedItemIndex()"로 바꾸어 주시면 됩니다. 참고: * stl map쓰는데 에러가 납니다 * std::map 의 무서운 비밀 * std::map 레퍼런스

APM Setup의 PHP 버전 바꾸기

현재 APM Setup 7은 PHP 5.2가 기본적으로 설치가 되는데요. 저는  5.3이 필요했습니다. 검색을 통해 간단한 방법을 찾았습니다. 여기(PHP 다운로드 페이지) 로 이동합니다. 위 페이지에서 원하는 버전을 찾은 후, "VC9 x86 Thread Safe" 항목의 "Zip" 파일을 다운로드합니다. 받은 파일의 압축을 풉니다. APM Setup 모니터를 실행해서 아파치 서버를 멈춥니다. APM Setup이 설치된 폴더로 이동합니다. (제 경우에는 C:\APM_Setup) Sever 폴더로 이동합니다. 그러면 PHP5폴더가 보이실 텐데, 만약을 대비해서 해당 폴더의 이름을 PHP5_Backup 등으로 변경합니다. 위의 '3.'에서 압축을 풀어 나온 폴더를 Server 폴더로 이동 시킨 다음에 폴더의 이름을 PHP5로 바꿉니다. APM Setup 모니터에서 아파치 서버를 다시 시작합니다. 정상작동 하는지 확인합니다. (※ 만약 문제가 발생하는 경우에는 새로 '7.'에서 추가한 폴더를 지우고 백업해둔 폴더의 이름을 원래대로 바꾸어주세요. 다른 방법을 찾으셔야 합니다..) 참고 자료: phpschool - " apmsetup 에서 php 업데이트시 어떤 파일을 받아야 해요? " apmsetup - " apmsetup 7 에서 php 5.3.3 을 쓰는 문제 "

MySQL에서 BINARY 비교

PHP에서 DB에 IP를 저장해야할 일이 있었습니다. 여기 저기 찾아보니, php의 inet_pton을 이용하여 IP를 BINARY 형태로 바꾼 후 저장하는 것이 좋다고 하더군요. 그래서 BINARY 형의 열을 만들고, 다음의 질의문을 이용해 IP를 저장했습니다. "INSERT INTO log (ip, ins_date) VALUES ( ... 생략 ...)" 그리고 같은 IP를 가지는 행이 몇 개나 있는지 알아보기 위해 "SELECT count(*) FROM log WHERE ip = '... 생략 ...'"를 실행했는데, 분명히 값이 해당되는 행이 있는데도 불구하고 결과가 계속 0으로 나왔습니다. 알고 봤더니, BINARY 형은 삽입된 데이터가 자료형의 크기 보다 작은 경우, 데이터 뒤에 '\0'(null 문자)를 자동으로 추가하는데, 비교할 때는 '\0'가 있는 것과 없는 것이 다른 것으로 처리되어서 발생한 문제였습니다. 예를 들어 설명하면, log 테이블에 BINARY(16)인 ip 열이 있는데, 여기에 "abc"라는 값을 삽입하면, 실제로는 "abc\0\0\0 ..생략.. \0" 이런 값이 들어가게 되고, 만약 ip = "abc"라는 조건으로 검색을 하면, 뒤에 붙어 있는 '\0'들 때문에 제대로 검색이 되지 않습니다. 해결법은 간단합니다. BINARY 대신에 VARBINARY 형을 사용하시면 됩니다. 참고: http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21689&cat1=11&cat2=334&cat3=347&lang=k