다음 게시물에서 심볼 이름을 얻는 아주 좋은 방법을 발견했습니다. Backtracing 할 때 어떻게 파일 이름과 줄 번호를 얻을 수 있습니까?
그러나 파일 이름과 줄 번호보기에 대한
. 나는 SymGetLineFromAddr64를 사용하려했지만이 디버그 정보를 얻을 수 없었다.다음 게시물에서 심볼 이름을 얻는 아주 좋은 방법을 발견했습니다. Backtracing 할 때 어떻게 파일 이름과 줄 번호를 얻을 수 있습니까?
그러나 파일 이름과 줄 번호보기에 대한
. 나는 SymGetLineFromAddr64를 사용하려했지만이 디버그 정보를 얻을 수 없었다.이 디버그 정보를 얻을 수없고 코드가 정확하다면 옵션에 문제가있을 수 있습니다. 이 정보가로드 할 SYMOPT_LOAD_LINES
이 필요합니다 : 당신은 당신이 제공 한 링크의 코드를 사용하는 가정하여,
SymSetOptions(SYMOPT_LOAD_LINES);
를 다음에, 다음과 같이 될 것이다 :
DWORD dwDisplacement;
IMAGEHLP_LINE64 line;
SymGetLineFromAddr64(process, (DWORD64)stack[i], &dwDisplacement, &line);
지금 당신이이 line
멤버에 액세스 할 수 있습니다 (IMAGEHLP_LINE64 structure에서) :
DWORD LineNumber;
PTSTR FileName;
감사합니다. 실제로이 문제가 해결되었습니다. 나는이 함수에 대해 동일하게 가정하기 때문에 SymFromAddr에서 선택 사항 이었기 때문에 NULL을 세 번째 매개 변수에 전달했습니다. – Imran
선택적 매개 변수가있는 API 함수가 많이 있지만 null이 아닌 포인터를 전달하는 것이 안전합니다. 이런 종류의 매개 변수를 가진 함수의 또 다른 예는'CreateThread'입니다.'threadID' 매개 변수는 선택 사항이며 다른 사람들은'NULL'을 전달하지만 다른 사람들은 포인터를 전달합니다. IMHO, 나는 안전상의 이유로 항상 유효한 포인터를 전달하는 것을 좋아한다. 물론 API 기능을 잘 알고 있다면 원하는대로 할 수 있지만 의심 할 여지없이 안전한 방법으로 수행하십시오. –
네, 당신은 절대적으로 옳습니다. 그것은 단지 내가 마지막으로 저장할 수있는 몇 초를 절약하고 싶었 기 때문에 나에게 일어났습니다 :) 그리고 두 함수의 서명은 이렇게 비슷하지 않았습니다 (마지막 매개 변수 제외). 나는 그렇게 생각할 수 없었습니다. – Imran
무엇을 시도 했습니까? 바이너리가 디버깅 정보로 빌드되어 있습니까? – nneonneo
예 GetLastError 함수를 사용하여 마지막 오류를 가져온 경우 디버그 정보로 빌드됩니다. 나는 0xc0000005가있다. – Imran
내 말은 ... 시도한 코드를 게시 할 수 있습니까? [SSCCE] (http://sscce.org/) 선호. – nneonneo