Go Top

2019年1月17日 星期四

一些比較少人知道的 VisualStudio 偵錯功能

轉載:
這篇主要是針對微軟 VisualStudio Team 部落格的《7 lesser known hacks for debugging in Visual Studio》和《7 More Lesser-known Debugging Tactics for Visual Studio》這兩篇文章,做簡單的整理。
在 Heresy 來看,微軟的 Visual Studio 算是目前數一數二的程式開發環境。不過另一方面,它的功能也相當地多,多到一般人應該有超過七成的功能都沒有用過。而在這些從來沒用過、甚至從來不知道的功能裡面,其實有些是相當實用、相當方便的!
微軟在這邊就是列出了 7 + 7 個罕為人知的 debug 技巧,來分享給開發者;不過裡面有的內容是針對 C# 這類 managed code 的,有的則是針對原生 C++ 的,並非全部都可以使用。
而這邊 Heresy 則是稍微再重新整理一些 C++ 可以用、個人也覺得比較有用的出來了~
另外,這邊所列的功能,大多是在 Visual Studio 2015 就已經有的,不過還是有部分功能是 Visual Studio 2017 才有的;如果是 2017 才有的,這邊也會特別強調。

跳到特定的陳述式(Set Next Statement)

這個功能是在 Visual Studio 2015 就可以用的功能,而在 2017 版則是簡化了他的操作。
在 Visual Studio 中進行偵錯,中斷的時候,一般是可以使用 F10 來逐行執行程式,進行分析;另外也可以透過 Ctrl + F10(執行至游標處),直接執行到滑鼠游標所在的位置。
但是實際上,在偵錯模式是,Visual Studio 在原始碼的右鍵選單中,還有一個「設定下一個陳述式」(Set Next Statement)的功能(Ctrl + Shift + F10),可以直接讓 Visual Studio 無視原本的順序、跳到特定陳述式。
透過這樣的方法,就可以在不修改程式的情況下,透過偵錯模式,來調整程式的執行順序;例如可以跳過某些程式碼,或甚至直接跳回之前的段落。如果程式本身編譯要很久的話,這樣可以不用重新編譯的調整流程功能,某方面來說,也算滿實用的了。

Visual Studio 2017 中,則是進一步簡化這個功能的操作。
在 VS 2017 裡,在偵錯模式中斷的情況下,把滑鼠游標移到每一行程式碼的前面,都會有一個往右的綠色箭頭,代表本來的「執行至游標處」,只要點下去,他就會依序執行到這一行。
而如果在此時壓住鍵盤的 Ctrl 的話,綠色的箭頭就會變成黃色的,而此時點下去,他就是「設定下一個陳述式」的功能,可以讓 Visual Studio 把標記移到這邊,告訴他接下來要執行這邊的程式碼。
下面的動畫圖,就是官方提供的示意:

修改變數的值

Visual Studio 在偵錯時另一個有趣的功能,是許允開發者可以不修改程式碼、直接修改變數的值。
也就是說,如果偵錯進行到一半,發現某個變數計算錯誤了,此時可以選擇不要修改程式重新偵錯,而是直接把這個值修改成正確的值,然後繼續執行下去。
而要在偵錯時修改變數的值,有三種方法。
  1. 在「資料提示」(DataTips)的地方直接修改
    在偵錯模式時,把滑鼠游標移動到變數上,會出現一個小小的浮動視窗、顯示這個變數的名稱和值。而這時候,點選他的值的部分,就可以修改他的值,然後繼續偵錯了。
  2. 在變數視窗(自動變數、區域變數、監看式)(Autos, Locals, Watch windows)中修改
    當透過自動變數、區域變數或監看式的視窗來觀察變數的資料的時候,用滑鼠雙集值的位置,也可以修改變數的數值。
  3. 使用「即時運算視窗」(Immediate window)修改
    在「即時運算視窗」裡面,可以直接在這邊修改變數的值。
    這個視窗的開啟方法,是點選工具列的「偵錯」、「視窗」、「即時運算」。
    不過這部分 Heresy 以 C++ 專案測試總覺得怪怪的,像是要把整數 x 改成 10 的話,不能輸入「x=10;」而是得輸入「x=10」…

在「呼叫堆疊」顯示參數值(Show parameter values in the Call Stack)

Visual Studio 的「呼叫堆疊」(Call Stack)視窗可以很方便地看出來目前程式執行的地方,是從那些函式一路呼叫下來了,相當地方便。
而實際上,他還有一個預設被關閉的選項、「顯示參數值」(Show Parameter Values ),在開啟後是可以讓偵錯時更方便地了解函式呼叫的狀況的~
只要在「呼叫堆疊」的視窗按右鍵,就可以找到這個選項了。本來只會顯示有哪些參數,開啟之後就會直接把呼叫時所傳進來的參數值也顯示出來了。
這個視窗的開啟方法,是點選工具列的「偵錯」、「視窗」、「呼叫堆疊」。

使用「平行監看式」來確認遞迴函式中的值(Look at values throughout recursive function calls)

「平行監看式」(Parallel Watch)這個視窗基本上是設計用來針對多執行序程式,同時監控不同執行序中的資料用的工具。
不過,他實際上也可以用來監控遞迴函式每個階段的狀態~
只要在偵錯狀態下開啟「平行監看式」(點選工具列的「偵錯」、「視窗」、「平行監看式」),並在各個欄位輸入要監看的式子、或是變數,接下來在執行遞迴函式的時候,就可以看到這些監看式在每次遞迴時的值了!

中斷點的進階使用

一般在使用 Visual Studio 的中斷點的時候,大多是會再要停止的程式碼前面,逐行加入中斷點,讓 Visual Studio 執行到這行的時候就停下來。
不過實際上,Visual Studio 的中斷點,事還有很多進一步的功能可以使用的!包括了可以設定中斷點的條件,或是去監看某個記憶體位址、當值有變化的時候中斷。這些中斷點的進階功能,都可以更方便地根據變數來做中斷的控制。

附加中斷條件
其中一個方法,是在中斷點上附加條件,只有在值有變化、或是符合指定條件時,才中斷程式。
要使用這個方法,基本上就是先透過本來的方法,在程式碼中加入中斷點(可以用快速鍵 F9);然後在中斷點的紅圈上按下滑鼠右鍵、選擇「條件」(condition)。接下來就只要在跳出的框框中,輸入自己需要的條件就可以了。

監控記憶體位址
而另一個只能用在原生 C++ 的方法,則是直接去監控記憶體位址,當變數值改變時就停止。
這個方法可以透過點選工具列的「偵錯」、「新增中斷點」、「資料中斷點」,來教出對應的視窗。在裡面,只要輸入變數的記憶體位址(或是用「&myVal」的形式)、以及對應的位元組數,就可以了。
這樣設定後,不管是在任何地方修改到這個變數,Visual Studio 都會停下來。所以如果是某個變數在不知道哪裡被修改的時候,這樣的中斷方式是非常有用的!
不過這邊也要注意,由於每次執行的時候,記憶體位址都會變化,所以當程式結束後,這個中斷點就會被停用;如果要重新啟用,則需要手動再做設定。

針對函式名稱中斷
Visual Studio 另外還有提供一個「函式中斷點」(Function breakpoint)的功能,可以讓使用者直接輸入函式名稱來完成設定。
透過這個方法來設定中斷點的好處,主要是可以不用手動去找到要中斷的函式的實際位置,只要知道名稱、就可以中斷了!
而這個方法的使用條件也很簡單,只要點選工具列的「偵錯」、「新增中斷點」、「函式中斷點」,然後再輸入函式名稱就可以了。

使用中斷點視窗檢查、管理所有中斷點
點選工具列的「偵錯」、「視窗」、「中斷點」,可以打開「中斷點」的視窗;在這個視窗裡面,可以看到所有的中斷點,同時也可以進行中斷點的新增。
當之前加了一堆中斷點,想要大量修改的時候,這個視窗會是相當好用的工具。

這篇就先寫到這裡吧~本來兩篇文章裡面,還有一些針對多執行序程式偵錯的技巧,目前是沒什麼需求,等之後有碰到再說吧~ :p
閱讀更多 »

線上編譯器

一般來說,要進行程式開發,或多或少都需要建立一個開發環境,才能來做開發。不過,如果臨時需要測試一個簡單的語法能不能運作的時候,要為此弄一個開發環境,有的時候會有點麻煩。
而這一篇,算是簡單介紹兩款 Heresy 知道的兩個支援多種不同程式語言的線上編譯器。可以用來做一些簡單的程式開發時的測試。

compile online </> com

除了一般像是 C++、C、C#、Java 等等語言外,也還支援 Matlb、R、SQLite SQL 等等~除了這些本機的程式外,他也支援網頁上的程式、或是標記語言,像是 HTML、CSS、JQuery、JQueryUI 等等。
要使用也相當簡單,只要選擇要測試的語言後,就可以在左邊輸入自己要測試的內容,然後按下左上方的按鈕(以 C++ 來說就是「Compile & Execute」),就會在右邊呈現結果了~
整個網站相當地乾淨、單純,對於自己要做測試來說,應該算是相當地便利~

ideone.com

一樣也是支援相當多總程式語言,C、C++、Go、Java 都有支援;另外,也支援 Node.js、SQL、PHP 等等。(還有支援 Text 是怎樣? o_O)
使用方法,就是在左邊選擇要使用的語言後,在右邊輸入程式碼的內容後,按下左下方的送出就可以了~
相較於「compile online </> com」,ideone 多了不少廣告,版面看來比較雜;不過,他在送出程式碼後,是會有一個網址,可以把自己的程式碼、以及執行結果傳給別人看的~如果要給別人看自己寫的程式、或是要和別人討論程式碼,ideone 應該算是個不錯的選擇。

基本上,這兩者都算是可以簡單測試程式的網站。不過,他也是有它的限制的,像是以 C++ 來說,如果有用到其他函式庫,那基本上就沒戲唱了~他大致上,就是拿來做 C++ 標準語法、或是 STL 的測試了。
而實際上,「compile online </> com」和「ideone」兩者雖然都可以拿來測試程式碼,不過在本質上,應該算是有當的差異的。「compile online </> com」基本上就是為了測試程式碼而發展出來的,所以要修改、執行都相當地方便~
相較之下,ideone 應該算是以程式碼片段的分享,為主要訴求?Heresy 個人是覺得 ideone 在程式碼的編輯上,沒那麼好用;但是相對的,他提供可以分享的功能,則是「compile online </> com」所缺乏的功能!
總之,這算是兩個實用的工具網站,有需要的人,就記下來以備不時之需吧~
閱讀更多 »

2019年1月14日 星期一

[test] 顯示 GitHub Gist 程式碼,並且套用(比較)一致的顯示風格

GitHub 是現在很熱門的程式碼管理工具,它甚至也提供了純粹用來分享程式碼片段的功能: Gist。甚至不需要註冊,就可以使用,也支援版本管理。當然,它也提供了在網頁上顯示程式碼的功能,只要複製要 分享的程式碼片段的頁面 左邊的 Embed this gist 內容,貼到 html 上即可。 貼上的 html 程式碼,長得像這個樣子: <script src="https://gist.github.com/tsaiid/6b4b20242367425726fb.js"></script>
閱讀更多 »

[教學] 如何在網頁blogger中插入程式碼

轉貼自: https://pjchender.blogspot.com/2015/03/blogger.html

有時候,我們會想在文章中插入語法,讓其他人可以比較清楚的瞭解,過去我常常是透過截圖的方式,但這麼做的缺點是,對方並不能直接複製貼上,那麼我們要怎麼在文章中插入語法呢?



像這樣:<pre class="codeblock prettyprint">
</pre>



首先在版面配置區插入HTML/JavaScript小工具的方式

STEP 1:


STEP 2:

STEP 3:

STEP 4:接著在HTML/JavaScript中貼入以下語法

在小工具中貼入以下程式碼

<style>
.post .codeblock {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 10pt;
overflow:auto;
background: #f0f0f0 url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAASwCAYAAAAt7rCDAAAABHNCSVQICAgIfAhkiAAAAQJJREFUeJzt0kEKhDAMBdA4zFmbM+W0upqFOhXrDILwsimFR5pfMrXW5jhZr7PwRlxVX8//jNHrGhExjXzdu9c5IiIz+7iqVmB7Hwp4OMa2nhhwN/PRGEMBh3Zjt6KfpzPztxW9MSAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzB8HS+J9kUTvzEDMwAAAABJRU5ErkJggg==) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:1000px;
line-height: 1.2em;
}
</style>

如圖所示

STEP 5:
接著只要把想要放在code裡面的語法用,開頭用: 
<pre class="codeblock ">
結尾用這個: 
</pre>
像是這樣
<pre class="codeblock">
中間可以插入你想放入的程式碼
</pre>

這樣就可以了 

STEP 6:當程式碼中包含「<>」時,需轉碼
如果程式碼中包含方角時,需要先把原本的程式碼轉碼,透過這個網站即可以輕易完成。


補充:自動將程式碼上色

我們除了可以用上方的色盤將自己的程式碼套色外,
像這樣
結果會像這樣
<pre class="codeblock ">

我們也可以另外安裝一段JavaScript讓他自己幫我們上色,
安裝的方法很簡單,一樣透過最上面所說的方法新增「HTML/JavaScript」,新增下述這段語法:
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
這時候只要在原本的class後面在新增一段prettyprint,程式碼就會自動套色了, 像是這樣: 
<pre class="codeblock prettyprint">
中間可以插入你想放入的程式碼
</pre>

閱讀更多 »

2019年1月13日 星期日

[C#][WinForm] 中華民國身分證字號(第七代)-驗證及產生器

【載點】 https://www.haolizi.net/example/view_8808.html

【更新記錄】

※更新日期:2016-08-13 17:30

※更新內容:

‧中華民國身分證字號(第七代) 序號產生並驗證


【原始碼特點】
      本軟體是一個WinForm的中華民國身分證字號(第七代) 序號產生並驗證。
■功能介紹
      可依照需要的選擇資訊如"縣市別"、"男性"、"女性"、"隨機"…等產生符規的身分證字號。
並提供驗證機制

閱讀更多 »

2019年1月12日 星期六

[C#]WinForm的簡易取色器


下載:https://www.haolizi.net/example/view_18616.html

【更新記錄】

※更新日期:2019-01-11 05:13

※更新內容:

‧對話方塊開啟時預設為"自訂色彩控制項"
----------------------------------------------------------------------------------

【原始碼特點】
‧本軟體是一個WinForm的簡易取色器。

■功能介紹
‧可使用系統顏色選擇器或螢幕取色器來查詢顏色值。


顏色選擇器由以下幾個部分組成:

•三種色彩空間的參數查詢
•用於ASS 和 HTML的16進制色彩值代碼
•從螢幕中一區塊,建立一個迷你截屏,然後從中取色

三種可用的色彩空間介紹:
•RGB顏色空間
RGB(red,green,blue)顏色空間最常用的用途就是顯示器系統,彩色陰極射線管,彩色點陣圖形的顯示器 都使用R、G、B數值來驅動R、G、B 電子槍發射電子,並分別激發螢光屏上的R、G、B三種顏色的螢光粉 發出不同亮度的光線,並通過相加混合產生各種顏色;掃描器也是通過吸收原稿經反射或透射而發送來 的光線中的R、G、B成分,並用它來表示原稿的顏色。RGB色彩空間稱為與設備相關的色彩空間,因為不同 的掃描器掃描同一幅圖像,會得到不同色彩的圖像資料;不同型號的顯示器顯示同一幅圖像,也會有不同 的色彩顯示結果。顯示器和掃描器使用的RGB空間與CIE 1931 RGB真實三原色表色系統空間是不同的,後者 是與設備無關的顏色空間。btw:Photoshop的色彩選取器(Color Picker)。可以顯示HSB、RGB、LAB和CMYK 色彩空間的每一種顏色的色彩值。
•HSB顏色空間
HSB(hue,saturation,brightness)顏色空間,這個顏色空間都是使用者桌上型電腦圖形程式的顏色表示, 用六角形錐體表示自己的色彩模型。










閱讀更多 »

2018年11月5日 星期一

[C#]去除string中重複的值

//去除string中重複的值
string mStr = "1,2,3,2,4,62,24,64,1,4,75,3,2,4,75";
            string[] str = mStr.Split(',').Distinct().ToArray();
            mStr = string.Join(",", mStr.Split(',').Distinct().ToArray());
            textBox1.Text = mStr;
閱讀更多 »
Copyright © BCL BLOG | Powered by Blogger