簡體   English   中英

以優化的代碼行停止調試器

[英]Stopping debugger at an optimized out line of code

如果我想停在一個空的代碼塊中,那總是一個問題。

if (...)
{ // I want the debugger to stop here!
}

如果我添加任意一行代碼,這些代碼不影響程序行為,則可能會根據代碼行對其進行優化

if (...)
{ 
   int a;
   a = a; // won't work
}
if (...)
{ 
   int a;
   int b = a; // will work
}

因此,這里出現兩個問題:

1)什么最簡單的單行代碼不會被優化(但實際上什么也做不了!),可以用來停止調試器? 2)有沒有辦法切換所有優化,以便能夠停在任意代碼行? 編譯器標志-O0不起作用。

足夠好的單行代碼可能是一些有用且有趣的assert語句,但條件是編譯器無法將其固定折疊。 通常,一些有意義且有用的assert (p!=NULL)assert(i>0)足夠了,其中p是一些現有的指針變量或形式,或者i是一些現有的帶符號整數變量或形式。

順便說一句,您處於項目的調試階段,因此添加足夠好的有意義的assert語句將很有幫助。 當然,您希望包含<cassert>標頭。

不要忘記,如果使用-DNDEBUG標志進行編譯,則會跳過assert(3)語句。

您也可以在Linux / x86上使用asm volatile ("nop") 注意,調試器需要一些代碼來放置斷點。 您不需要代碼。

使用靜態斷點呢?

#include <sys/sdt.h>

if (condition)
  DTRACE_PROBE(myapp, foo);

現在,您可以在GDB中設置一個斷點

break -probe-stap myapp:foo

您甚至可以使用:

DTRACE_PROBE1(myapp, foo, condition);

有:

break -probe-stap myapp:foo if $_probe_arg0

暫無
暫無

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

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