Visual Studio 에서 실행한거랑 빌드결과 나온 exe 를 실행하는거랑 다른가요?

konbenia의 이미지

프로그램을 만들던 도중 Release 로 놓고 컴파일러 상으로 실행한것이랑 컴파일러되서 나온 EXE 를 실행한것이랑 결과가 다르다는것을 알았습니다.
에러가 나거나 그렇진 않지만 그냥 프로그램 실행결과 나오는 데이터가 아주 완벽하게 다르게 나오네요. 이상하게 debug 는 다 같고요.

정리해보자면 debug로 컴파일러상 실행한것, debug로 컴파일된 exe를 실행한것, Release로 컴파일러상 실행한것 은 결과가 같고요 Release로 컴파일된 exe 를 실행한것만 결과가 다르네요.

혹시 실행경로상 문제일까봐 EXE 를 프로젝트 폴더에 놓고 실행해봐도, 관리자 권한으로 실행해봐도, 프로젝트를 다시 만들어서 실행해봐도, 최적화도 풀어보고 다
바꿔봐도 결과가 다르게 나와서 삽질을 열심히 하고있습니다... ㅠㅠ

이런 현상의 원인이 될 만한것, 어떤것이 있는지 조언부탁드립니다 (-_-) (_ _) (-_-)

익명 사용자의 이미지

Debug 모드로 컴파일 하면 Release 모드와는 몇가지 다른부분이 있습니다.

저도 잘 기억은 안나니까 그 차이점을 중점으로 검색을 해보시면 나올껍니다.

대충만 말씀드리면...

스택 검사 여부
할당된 메모리 초기화(0xcc)
반납된 메모리 초기화
등등입니다.

결론은 "잘못" 만들어진 프로그램은 Debug 와 Release 에서 좀 다른 동작을 할 경우가 있습니다.

konbenia의 이미지

컴파일러에서 실행한 release 랑 exe 로 나온 release 랑 다르다고요.

debug 모드랑 상관없이요. ㄷㄷ

qiiiiiiiip의 이미지

release로 컴파일한것과 debug로 컴파일한 것이
결과가 다른 일은 흔한 일이고 주요 원인은 앞의 분 말씀대로입니다.
주로 초기화하지 않은 변수를 사용한 경우가 대부분이었습니다.

특이한 현상은 같은 release모드에서,
IDE상에서 실행한 것과, 실행파일을 독립적으로 실행한 경우 결과가 다르다는 것인데,

처음에는 당연히 working directory관련 환경문제를 의심했으나,
그것도 해보셨다고 하니 좀 이상하긴 합니다만,

일단 현재 IDE상에서 실행할때 F5로 실행할것 같은데,
그러지 말고, Ctrl-F5로 실행해보면 어떨까 싶고요,

이것이 F5로 실행한 결과와 같다면,
단순히 환경 차이로 생기는 문제로 보이고요,

이것이 독립실행한 것의 결과와 같다면
초기화 관련 문제를 의심해봐야할 것 같네요.

konbenia의 이미지

말씀하신데로 해본결과, 독립실행한것과 Ctrl-F5 의 결과가 같고 그냥 F5의 결과만 다릅니다.

초기화 관련문제라면 어떤것인지 설명해주실 수 있나요?

익명 사용자의 이미지

현재까지 대화로 보면 초기화 문제 100%입니다.
변수 하나하나 확인하면서 정의할 때 0 넣었는지 확인하세요.

qiiiiiiiip의 이미지

초기화 관련문제는 이런거죠..

int foo( int param )
{
    int i;
    if ( param < 0 ) i = 0;
    else if ( param > 0 ) i = 1;
    return i; // param이 0이라면?
}

float bar( int* a, unsigned len )
{
    int i;
    float sum;
    for ( i = 0 ; i < len ; i++ )
       sum += a[i]; // sum의 초기값은?
    return sum;
}

디버그모드에서는 자동으로 0으로 초기값이 채워집니다만,
릴리즈모드에서는 아니죠.

gcc의 경우 컴파일타임에서 대부분 warning이 뜨고,
valgrind에서 런타임 동작을 확인할 수 있습니다만,
windows환경에서는 잘 모르겠네요. 툴이 있겠지요.

차이가 나는 부분을 단계적으로 따라가보시는게 좋겠네요.

라스코니의 이미지

최적화 옵션을 끄고 release 모드로 해 보세요. 혹시 정확하게 동작하는지....
Debug에서 나온 결과와 같다면 최적화하는 과정에서 예상치 못하게 변경될 가능성이 있네요.

익명 사용자의 이미지

혹시 Release 모드에서 Debug(F5) 를 하신건가요?? 그럴 경우 결과가 달라집니다.
Debug 모드에서 F5를 하셔야 제대로 디버깅이 가능합니다
이유는 Release 모드에서는 Debug정보가 없기때문입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.