網頁

顯示具有 c++ 標籤的文章。 顯示所有文章
顯示具有 c++ 標籤的文章。 顯示所有文章

2023年3月29日 星期三

檢查 memory leak

安裝 valgrind
$ sudo apt update
$ sudo apt install snapd
$ sudo snap install valgrind --classic

$ gcc -g -o debug_prog debug_prog.c
$ g++ -g -o debug_prog debug_prog.c

開啟兩個 terminal
$ valgrind --vgdb=yes --vgdb-error=0 --tool=memcheck --leak-check=full ./debug_prog

$ gdb ./debug_prog
(gdb) target remote | vgdb
(gdb) break linenum
(gdb) next
(gdb) step
(gdb) monitor leak_check full reachable any
(gdb) kill
(gdb) quit

若只是單純檢查 memory leak
$ valgrind --tool=memcheck --leak-check=full ./debug_prog

suppression 一些錯誤
$ valgrind --tool=memcheck --leak-check=full --gen-suppressions=all ./debug_prog
...
{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   match-leak-kinds: definite
   fun:malloc
   fun:g_malloc
   obj:/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5600.4
   fun:call_init
   fun:_dl_init
   obj:/lib/x86_64-linux-gnu/ld-2.27.so
}
...

利用上個命令的輸出,產生 local.supp 檔
$ valgrind --tool=memcheck --leak-check=full --supressions=./local.supp ./debug_prog
$ valgrind --tool=memcheck --leak-check=full --gen-suppressions=all --log-file=supp.log --supressions=./local.supp ./debug_prog
$ cat ./supp.log | ./suppressions.sh > local.supp
$ valgrind --tool=memcheck --leak-check=full --supressions=./local.supp --supressions=./gtk.supp ./debug_prog

suppressions.sh 若產生下列錯誤
awk: 34: unexpected character '&'
需改變 awk 的版本為 gawk
$ awk -W version
$ sudo apt-get update
$ sudo apt-get install gawk

去除 definitely loss
== 16,384 bytes in 1 blocks are definitely lost in loss record 1,443 of 1,448
==    at 0x4C330C5: malloc (vg_replace_malloc.c:393)
==    by 0x6A0BBD8: g_malloc (gmem.c:99)
==    by 0x6A1674B: g_quark_init (gquark.c:62)
==    by 0x40108D2: call_init (dl-init.c:72)
==    by 0x40108D2: _dl_init (dl-init.c:119)
==    by 0x40010C9: ??? (in /lib/x86_64-linux-gnu/ld-2.27.so)

下載 gst.supp 和 glib.supp gtk.supp
https://gitlab.freedesktop.org/gstreamer/common/-/blob/master/gst.supp
https://github.com/GNOME/glib/blob/main/tools/glib.supp
https://gist.github.com/pendingchaos/81feddb95c06aeb58e2f

Makefile 的
CFLAGS+= -g -O0

安裝 libglib 的 debug symbols 版本
$ echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list
$ sudo apt install ubuntu-dbgsym-keyring
$ sudo apt update
$ sudo apt install libglib2.0-bin-dbgsym libglib2.0-0-dbgsym libglib2.0-dev-bin-dbgsym


export G_DEBUG=gc-friendly
export G_SLICE=always-malloc

valgrind -v --time-stamp=yes --tool=memcheck --leak-check=full \
  --gen-suppressions=all --log-file=supp.log \
  --suppressions=./glib.supp \
  --suppressions=./gst.supp \
  --suppressions=./gtk.supp \
  ./main

常用觀測記憶體使用狀態命令
$ while true; do echo -n `date +"%Y/%m/%d %H:%M:%S"`" " | tee -a aaa.log ; grep "VmRSS" /proc/26885/status | tee -a aaa.log ; sleep 60 ; done
$ watch "grep 'VmRSS\|VmPeak\|VmData\|VmStk\|VmExe\|VmLib\|Threads' /proc/26885/status" 


2023年1月3日 星期二

debug in Ubuntu

參考 讓程序崩潰時產生core dump
$ g++ -g test.cpp 
$ gcc -g test.cpp 
# 編譯程式時加入 -g 
$ ulimit -a core file size        (blocks, -c) 0
# 表示部會產生 core dump
$ ulimit -c unlimited
# 將 core file size 改為 unlimited
$ sudo apt install systemd-coredump
$ coredumpctl
# 列出所有的 core dump
$ coredumpctl gdb
# 打開最近的 core dump
$ coredumpctl gdb 123
# 打開 pid=123 的 core dump
(gdb) bt
# back trace 顯示錯誤的地方
(gdb) q
# 離開 gdb

2020年9月8日 星期二

GStreamer 安裝

依據說明文件安裝
sudo apt-get install libgstreamer1.0-0
sudo apt-get install gstreamer1.0-plugins-base
sudo apt-get install gstreamer1.0-plugins-good
sudo apt-get install gstreamer1.0-plugins-bad
sudo apt-get install gstreamer1.0-plugins-ugly
sudo apt-get install gstreamer1.0-libav
sudo apt-get install gstreamer1.0-doc
sudo apt-get install gstreamer1.0-tools
sudo apt-get install gstreamer1.0-x
sudo apt-get install gstreamer1.0-alsa
sudo apt-get install gstreamer1.0-gl
sudo apt-get install gstreamer1.0-gtk3
sudo apt-get install gstreamer1.0-qt5
sudo apt-get install gstreamer1.0-pulseaudio

還需另外安裝
sudo apt-get install libgstreamer1.0-dev
sudo apt-get install libgstreamer-plugins-base1.0-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install clutter-gst-3.0
sudo apt-get install libclutter-gst-3.0-0
sudo apt-get install libclutter-gst-3.0-dev

下載教學範例
git clone https://gitlab.freedesktop.org/gstreamer/gst-docs

Makefile 中
PKGS := gstreamer-1.0 gtk+-2.0 clutter-gst-3.0
CFLAGS += `pkg-config --cflags $(PKGS)`
LIBS += `pkg-config --libs $(PKGS)`

$(MAKECMDGOALS).o: $(MAKECMDGOALS).c Makefile
$(CC) -c -o $@ $(CFLAGS) $<

$(MAKECMDGOALS): $(MAKECMDGOALS).o Makefile
$(CC) -o $@ $@.o $(LIBS)

2015年6月18日 星期四

CFileDialog 的 Exception

CFileDialog 會產生下列例外,就不要理它吧!

First-chance exception at 0x76674598 (KernelBase.dll) in UrgPair.exe: 0x000006BA: RPC 伺服器無法使用。.

First-chance exception at 0x76674598 (KernelBase.dll) in UrgPair.exe: 0x800706B5: 不明的介面。.

First-chance exception at 0x76674598 (KernelBase.dll) in UrgPair.exe: 0x8001010E: 應用程式所呼叫了整理給不同執行緒的介面。.


2015年1月22日 星期四

利用 gmail 傳送 email

測試一直失敗,而後收到 googole 寄給我的一封信
重要的內容如下:

您可以改用 Google 開發的應用程式 (例如 Gmail) 存取帳戶 (建議做法),或是前往https://www.google.com/settings/security/lesssecureapps 變更相關設定,為您的帳戶停用最新安全性標準。

點入上述網頁,進入 安全性較低的應用程式,點選 啟用
重新寄信即可

gmail -> yahoo
mail.SetLogin("gingrenn@gmail.com");
mail.SetPassword("ingrenn1234");
  mail.SetSenderName("mark chen");
  mail.SetSenderMail("gingrenn@gmail.com");
//   mail.SetReplyTo("user@yahoo.com.tw");
  mail.SetSubject("The message");
  mail.AddRecipient("ingrenn@yahoo.com.tw");

yahoo -> gmail
mail.SetLogin("ingrenn");
mail.SetPassword("mark1234");
  mail.SetSenderName("ingrenn");
  mail.SetSenderMail("ingrenn@yahoo.com.tw");
//   mail.SetReplyTo("user@yahoo.com.tw");
  mail.SetSubject("The message");
  mail.AddRecipient("gingrenn@gmail.com");



2014年10月28日 星期二

Windows 7 的蜂鳴器出了問題

Beep 沒了聲音
因為音效卡沒接喇叭,Windows 7 又把 Beep 轉到音效卡


2014年10月27日 星期一

在VisualStudio中混合了.cpp和.c 出現C1853錯誤

開啟 .c 檔的 Property Page,進入C/C++內的 Precompiled Headers
在 Create/Use Precompiled Header 中選擇 Not Using Precompiled Headers

2014年9月11日 星期四

MSB8031 錯誤

Visual Studio 2013 編譯時出現 MSB8031 錯誤
是因為微軟移除了 Visual Studio 2013 MFC 的 Multibyte 支援
可下載 Multibyte MFC Library for Visual Studio 2013 解決

2014年8月27日 星期三

2014年8月25日 星期一

字串分行

CString str1 = "12345\
67890";
CString str2 = "12345"
                       "67890";

2014年8月6日 星期三

FTP 協定

通常 IP分享器會認得 FTP 的 PORT 命令
並且改寫內部IP為外部IP
但部分 IP分享器要求命令的結尾一定要用 \r\n 不能只有 \n

sprintf_s(buf, FTP_BUFFER_LEN, "PORT %s,%d,%d\n", hostIp, hPort, lPort);

sprintf_s(buf, FTP_BUFFER_LEN, "PORT %s,%d,%d\r\n", hostIp, hPort, lPort);

2014年8月5日 星期二

std vector 的消滅

早期使用方式:
for (vector<Vector4*>::iterator it = mPt.begin(); it != mPt.end();) {
Vector4 *pVt = *it;
delete pVt;
it = mPt.erase(it);
}

在大量數據時會很慢,更新為下列方式:
while (!mPt.empty()) {
Vector4 *pVt = mPt.back();
delete pVt;
mPt.pop_back();
}

2014年6月26日 星期四

DeadLock

一般說來 MultiThread 的 DeadLock,只要依序取得資源,是不會鎖死的。

但是遇到有畫面的 Thread 就複雜了,如下

1.工作Thread取得資源
2.畫面Thread等待資源
3.工作Thread 使用 畫面->SendMessage
4.鎖死...永遠的等待