윈도우 환경과 리눅스 환경에서의 callstack unwind에 대해서 질문드립니다.

김성진의 이미지

안녕하세요.

김성진이라고 합니다. (혹시 아시는 분이 계실지..)

최근에 업무상 윈도우에서 작업을 하는데, 한가지 이상한점이 있어서 질문드립니다.

KLDP에 LINUX를 비롯한 다른 고수님들도 계시는 것 같아서요.

다름이 아니고, 프로그램의 동작시에 현재의 위치로부터의 callstack을 얻는

모듈을 작성하고 있습니다.

다른 운영체제나 컴파일러 환경에서는 모두 동작하도록 하였는데,

유독 윈도우즈 환경의 최적화 모드에서는 제대로 나오지 않는군요.

제가 알고 있는 지식으로는 현재의 Frame pointer(intel의 경우는 BP 레지스터겠지요?)

를 따라가면 최상위 callstack으로 갈 수 있다라고 알고 잇는데,

VC 6.0, 7.0에서 /O1, /O2 혹은 /Ox 모드에서는 2개 정도의 callstack을 출력하고 마네요.

물론 /Od 인 디버그 환경에서는 문제가 없구요. (모든 함수의 호출 순서를 출력합니다)

좀 더 분석해 보니 /Og 라는 global optimization 이 있으면 그렇게 되는데,

(/Oy- 옵션을 줘서 frame pointer omit을 방지시켰습니다..이렇게 해도 똑같네요.

제 질문은

"윈도우 환경에서 /Og 이상의 환경에서는 callstack을 얻는 것이 불가능한것인지?" 입니다.

아니면, 다른 방법이 있는지요.

현재는 /Og 를 제거하고, work around 처리를 하고 있는데,

몹시 찜찜하세요.

고수님의 답변을 기다립니다.

김성진 올림

markboy의 이미지

EBP를 따라가도록 구현하셨나요? VC에서 최적화 작업을 수행하면 Stack에 EBP를 저장하지 않고 stack unwind를 할 수도 있기 때문에 제대로 따라갈 수 없습니다.

간단한 application을 작성해서 disassembly 해보시면 차이를 아실 수 있습니다.

김성진의 이미지

따라갈 수있는 방법이 없는지요.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

markboy의 이미지

예전에 테스트 했던 결과에서는 최적화 옵션을 준 상태의 App(물론 Release 빌드)에 강제로 AV가 나게 설정한 다음 WinDBG로 callstack을 보면 제대로 따라가지 못합니다.

Release 빌드시 /Zi 로 pdb를 생성하게 한 다음, pdb파일을 맞춰야 WinDBG에서 제대로 callstack을 얻을 수 있습니다.

이 결과로 보면 pdb 없이 단일 exe 만으로는 제대로 따라갈 수 없습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.