簡體   English   中英

Visual Studio C ++控制台應用程序無法運行

[英]Visual Studio C++ Console Application Won't Run

當C ++控制台應用程序生成並啟動但不運行任何代碼(至少沒有調試器可以看到的任何代碼)時,該怎么辦? 我有一個具有主要功能的程序:

int main (int argc, char *argv[])
{
    short retval = 0;
    retval = samain ( (short) argc, argv);
    return ((int) retval);
}

為了安全起見,我在第一行( retval=0 )及其后的行上放置了一個斷點,然后運行。 它顯示一個控制台窗口並掛起,直到停止調試器。 調試輸出顯示了許多正在加載的DLL,但沒有其他內容。 它的結尾與之前的數十行非常相似:

'fcmtsysmd.exe' (Win32): Loaded 'C:\Windows\SysWOW64\RpcRtRemote.dll'. Cannot find or open the PDB file.

我知道這是一個程序,可以在“正常”環境中運行並運行,因為數百人正在使用它,而我沒有更改代碼。 我的環境中的不同之處(因為我正在重寫安裝過程中)是:

  1. 我可能沒有正確安裝所有依賴項。
  2. 之前導致錯誤的DLL依賴項之一已被帶有隔離COM引用而不是其通常的COM引用的新建版本替換,因為它嘗試訪問的COM對象未注冊。 (我正在嘗試在我們的新安裝中實現隔離的COM。)

所以我的問題是,如果在執行第一行代碼之前發生錯誤,我該如何追蹤問題的根源?

我無法獲得明智的調用堆棧,因為即使我單步執行(F10鍵)以啟動程序,該程序也會立即掛起。 如果此時中斷,則會看到以下調用堆棧:

ntdll.dll!7743fdd1()    Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!7743fdd1()    Unknown
ntdll.dll!77475f86()    Unknown
ntdll.dll!77459809()    Unknown

當我從依賴的DLL中刪除隔離的COM設置時,我可以獲取訪問沖突異常並在調試器中停止某些代碼。 在另一個DLL中的靜態變量初始化期間被調用的函數上停止了該操作。 奇怪的是,當我將隔離的COM設置添加到第一個DLL,並在另一個DLL上放置一個斷點時,該斷點甚至都沒有命中。

事實證明,在依賴於其中一個DLL的某些靜態初始化邏輯觸發的對CoCreateInstance的調用期間,該應用程序已掛起。 我猜想訣竅是試圖在依賴的DLL中識別靜態初始化邏輯,並在其中放置斷點。 不幸的是,似乎沒有任何調試輸出可幫助識別哪個DLL的靜態初始化在何時執行,因此無法確定哪個DLL是問題所在。

我將在一個單獨的問題中詢問有關如何識別掛起的CoCreateInstance調用的源的問題,如果還沒有覆蓋它的問題: 使用隔離COM時在CoCreateInstance期間應用程序掛起

最終的答案是在https://stackoverflow.com/a/34076433/78162 (我必須自己創建)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM