none
請問Release和Debug裡面的.exe檔有什麼不同? RRS feed

  • 問題

  • 我在VB裡面用偵錯F5執行程式,可以正常執行,但是建置之後,在Release資料夾中的.exe檔卻無法正常執行,在Debug資料夾中的.exe檔卻可以執行。

    而且Debug資料夾中的.exe檔的檔案大小比較大,而Release裡面的比較小……

    請問在建置的時候,是不是有些東西處理的過程和偵錯執行時的處理不一樣啊?為啥建置之後反而程式無法正常執行呢?

    2013年5月9日 上午 01:38

解答

  • 聽你這樣形容, 程式的架構本身就有很大的問題.

    不妨把 .Net 海角點部落 Serialport 系列  看完, 把通訊架構的部份做一些改進


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月9日 下午 12:37
    版主
  • 卡在 While 為什麼不會是程式架構的問題 ? 我就從來不會卡在 While , 而且我的程式通常還可以同時有好幾個無限 While, 為何就從來沒見 UI 卡住過 ?

    程式架構上, 長迴圈從來就不能和 UI  執行緒在一起.

    如果你覺得沒關係, 那就沒關係好了, 前面當我沒說過. 你如果堅持 debug 會過,  release 就一定會過, 那繼續堅持無所謂,  反正我又沒有損失.

    再告訴你一點好了, 我沒看到程式碼, 敘述聽來像一問一答, 但一問一答的通訊程式用 Datareceived 本身就是個錯誤.

    對不起, 我多言了, 照您的敘述, 您的功力應該比我高很多, 我不應該廢話的


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年5月10日 上午 03:58
    版主
  • 我把 DataReceived 定位在入門者與高階者使用。中間的進階者不使用,入門者不懂,亂用。進階者懂了不敢用,高階者收發如意,隨便用。

    因為牽扯到多緒,進階者對於多緒不夠熟悉,玩成高階者後,才能安全的操控。

    舉例來說,我把時間軸放大,好觀看問題。

    1. 你的設備每秒回傳 1 byte 共 10 秒,假設你沒調整參數,依照預設值一收到回傳就會觸發事件。

    2. 你的事件需要執行 3 秒才能完成。

    第一秒,你的事件被觸發,SerialPort_DataReceived 是以 WorkThread 來跑事件,所以你的 MainThread 還閒閒的...

    第二秒,你的事件又被觸發,又開了一個 WorkThread 來跑事件...

    第三秒,你的事件再度被觸發,再開了一個 WorkThread 來跑事件...

    第四秒,第一秒觸發的事件跑完結束,但是又有新的事件被觸發...

    在此情況下,若是同時執行的 3 個  WorkThread 對 SerialPort 做 Read ... 你能預期目前的 byte 會被哪個執行緒讀走?


    2013年5月10日 下午 02:43
  • 1.小弟我的做法 是 開一些空間 收資料  交給 BK 處理   (  BK 這部分也是看 BILL 大哥的做法)

       您可以參考一下 ,ㄏㄏㄏ  

    'RS232 的部分
    Public RecBuf(1024) As Byte     
    Public Point As Integer
    Public Counter As Integer
    
    Public Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    
            Dim buflen As Integer = Me.ReadBufferSize
            Dim a(buflen - 1) As Byte
            Me.Read(a, 0, buflen)
    
            For i = 0 To a.Length - 1
    
            If ((Counter + 1) Mod RecBuf.Length) = Point Then
                    '收資料太慢了, 
                Else
                    RecBuf(Counter) = a(i)
                    Counter = Counter + 1
                End If
            Next
    
    
        End Sub
    '==== BK的部分
    
    Private Sub DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
            '開啟 COMPORT
            '做一些事情
            '下面等待接收
            While (1)
    
                If bkwork.CancellationPending = True Then
                    e.Cancel = True
                ElseIf (MyComPort.Point <> MyComPort.Counter) Then
                    '開始處理資料
                    '處理完回報
                    bkwork.ReportProgress(0, myStateObj)
                End If
    
            End While
    
        End Sub
    
        Private Sub ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
            '更新 UI 的地方
            Dim myStateObj As StateObj = (CType(e.UserState, StateObj))
    
    
        End Sub
    2. 要記得貼出錯誤訊息,或是程式碼,讓大家知道你的困難點。
     


    每天都在複製貼上,什麼時候才能自己寫出來~~哎.....


    2013年5月11日 下午 07:11

所有回覆

  • 您好,

    請參考: http://stackoverflow.com/questions/90871/debug-vs-release-in-net

    能不能Run跟程式比較有關系吧!

    如果您選取Release Mode在VS執行也是OK的話!

    那就是您程式的問題吧!

     


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年5月9日 上午 01:46
  • 1. 您建置時應選擇在Release 模式,而不是Debug模式

    2.Debug資料夾中的.exe檔的檔案大小比較大,是正常的,為偵錯建立的 .exe 檔或 DLL 含有對應的 PDB 之名稱和路徑

    2013年5月9日 上午 02:34
  • 你是不是有用到多執行緒處理 UI , 而且把 CheckForIllegalCrossThreadCalls 設為 False ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月9日 上午 04:29
    版主
  • 我沒特別去設定過控制項的CheckForIllegalCrossThreadCalls,預設值為False還是True?

    自從我以前發現跨執行緒時無法用一般的方式存取textbox,我就上網找到大家都用委派的方法,我目前在SerialPort DataReceived與backgroundworker裡面要存取textbox或其他控制項的時候,就都用委派的方法,按F5執行時也都沒有什麼錯誤,我也不知道是不是這個的原因,還是有其他原因使得建置的檔案無法執行。

    我是用VB 2008 express,我程式裡面一開始是按button1之後連上串列埠(我有連接單晶片),送一個指令給單晶片,用while迴圈不斷檢查一個flag,等到單晶片回應時,跳到DataReceived,然後確認回應無誤後,把flag=1,這時while迴圈結束,之後進入backgroundworker。

    我在偵錯模式下,執行是很正常的,但是建置之後開.exe檔,按鈕一按下,整個form就停住沒回應了,我推測是停在while迴圈等單晶片回應那裡。可能是串列訊號沒送出去,或是單晶片有回應但是程式沒有跳到SerialPort1_DataReceived吧…



    2013年5月9日 上午 08:09
  • 聽你這樣形容, 程式的架構本身就有很大的問題.

    不妨把 .Net 海角點部落 Serialport 系列  看完, 把通訊架構的部份做一些改進


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月9日 下午 12:37
    版主
  • 我倒覺得這和程式架構沒關係。

    應該是說,就算程式架構不是很好,但卡在while迴圈已經不是程式架構的問題了,我知道在button裡面寫while迴圈不太好,如果在while迴圈跑太久就會變成程式無回應的狀態,但那是在串列資料傳送、接收不良的前提下。

    因為我串列埠的鮑率、bit數、com port name…等等的都沒錯,MCU上的UART程式也沒錯,若串列資料有發送出去,MCU收到應該會回傳一個串列資料,而VB收到後,應該會跳到DataReceived,而確認回傳的資料沒錯後,while迴圈應該就會結束,所以在串列埠連接沒問題的前提下,就算我這個程式架構不太好,應該也不會出什麼問題。

    其實我也發現我的程式架構真的不是很好,因為在run的時候吃掉很多CPU資源,所以我目前也正在改程式,但我現在發問題主要焦點是在於按F5執行正常,但建置之後就不正常。因為真的程式有錯的話,應該按F5執行也會有問題吧。如果F5能執行,頂多表示程式寫的方法沒有很好,但至少也是能執行的。
    2013年5月10日 上午 12:22
  • 卡在 While 為什麼不會是程式架構的問題 ? 我就從來不會卡在 While , 而且我的程式通常還可以同時有好幾個無限 While, 為何就從來沒見 UI 卡住過 ?

    程式架構上, 長迴圈從來就不能和 UI  執行緒在一起.

    如果你覺得沒關係, 那就沒關係好了, 前面當我沒說過. 你如果堅持 debug 會過,  release 就一定會過, 那繼續堅持無所謂,  反正我又沒有損失.

    再告訴你一點好了, 我沒看到程式碼, 敘述聽來像一問一答, 但一問一答的通訊程式用 Datareceived 本身就是個錯誤.

    對不起, 我多言了, 照您的敘述, 您的功力應該比我高很多, 我不應該廢話的


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年5月10日 上午 03:58
    版主
  • 我把 DataReceived 定位在入門者與高階者使用。中間的進階者不使用,入門者不懂,亂用。進階者懂了不敢用,高階者收發如意,隨便用。

    因為牽扯到多緒,進階者對於多緒不夠熟悉,玩成高階者後,才能安全的操控。

    舉例來說,我把時間軸放大,好觀看問題。

    1. 你的設備每秒回傳 1 byte 共 10 秒,假設你沒調整參數,依照預設值一收到回傳就會觸發事件。

    2. 你的事件需要執行 3 秒才能完成。

    第一秒,你的事件被觸發,SerialPort_DataReceived 是以 WorkThread 來跑事件,所以你的 MainThread 還閒閒的...

    第二秒,你的事件又被觸發,又開了一個 WorkThread 來跑事件...

    第三秒,你的事件再度被觸發,再開了一個 WorkThread 來跑事件...

    第四秒,第一秒觸發的事件跑完結束,但是又有新的事件被觸發...

    在此情況下,若是同時執行的 3 個  WorkThread 對 SerialPort 做 Read ... 你能預期目前的 byte 會被哪個執行緒讀走?


    2013年5月10日 下午 02:43
  • 1.小弟我的做法 是 開一些空間 收資料  交給 BK 處理   (  BK 這部分也是看 BILL 大哥的做法)

       您可以參考一下 ,ㄏㄏㄏ  

    'RS232 的部分
    Public RecBuf(1024) As Byte     
    Public Point As Integer
    Public Counter As Integer
    
    Public Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    
            Dim buflen As Integer = Me.ReadBufferSize
            Dim a(buflen - 1) As Byte
            Me.Read(a, 0, buflen)
    
            For i = 0 To a.Length - 1
    
            If ((Counter + 1) Mod RecBuf.Length) = Point Then
                    '收資料太慢了, 
                Else
                    RecBuf(Counter) = a(i)
                    Counter = Counter + 1
                End If
            Next
    
    
        End Sub
    '==== BK的部分
    
    Private Sub DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
            '開啟 COMPORT
            '做一些事情
            '下面等待接收
            While (1)
    
                If bkwork.CancellationPending = True Then
                    e.Cancel = True
                ElseIf (MyComPort.Point <> MyComPort.Counter) Then
                    '開始處理資料
                    '處理完回報
                    bkwork.ReportProgress(0, myStateObj)
                End If
    
            End While
    
        End Sub
    
        Private Sub ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
            '更新 UI 的地方
            Dim myStateObj As StateObj = (CType(e.UserState, StateObj))
    
    
        End Sub
    2. 要記得貼出錯誤訊息,或是程式碼,讓大家知道你的困難點。
     


    每天都在複製貼上,什麼時候才能自己寫出來~~哎.....


    2013年5月11日 下午 07:11