註冊 登錄



打印

[程式編寫] Create cross platform framework in Xcode

[隱藏]
引用:
原帖由 sswroom 於 2017-8-20 09:55 AM 發表

Function Hooking現時好似已經不可行, 我試過在Instruction Segment做任何Memory Write也會出Access Violation
近排無咩點試過, 所以唔知, 不過如果同一個 process 應該有辨法做到, 如果唔係 JIT 可能都用唔到



實用相關搜尋: IT
引用:
原帖由 jasonchan35 於 2017-8-20 10:06 AM 發表



上半部係講 MSVC build
下半部先係 WSL
又好似係

佢加左MSVC之後都冇認真睇過






回覆 引用 TOP

引用:
原帖由 jasonchan35 於 2017-8-20 10:12 AM 發表



近排無咩點試過, 所以唔知, 不過如果同一個 process 應該有辨法做到, 如果唔係 JIT 可能都用唔到
問darigold 咪仲直接






引用:
原帖由 Susan﹏汪汪 於 2017-8-20 10:16 AM 發表


問darigold 咪仲直接
我現在用HeapAlloc/HeapFree已經做到所需的東西, 只是在Linux上做不到相似的功能
還有不少其他Debug的功能Windows做到, Linux未找到方法做/做不到.....






[隱藏]
引用:
原帖由 sswroom 於 2017-8-20 10:10 AM 發表

Windows 那個Hook Function只Support Debug Build, Release Build不Support, 即是不能用.....
Release mode 都可以另外出 debug symbol
https://accu.org/index.php/journals/1412

你唔遘得點 implement, 咁可唔可以講下係點用 ?
係唔係即係唔駛 wrap malloc or new
又可以係 release mode 知邊行 source code or function 做 allocation ?
用起上黎係點 ? 可唔可以俾 D code example ?



實用相關搜尋: windows
引用:
原帖由 jasonchan35 於 2017-8-20 10:27 AM 發表



Release mode 都可以另外出 debug symbol
https://accu.org/index.php/journals/1412

你唔遘得點 implement, 咁可唔可以講下係點用 ?
係唔係即係唔駛 wrap malloc or new
又可以係 release mode 知邊行 so ...
或者佢想要dump reference graph出來






回覆 引用 TOP

引用:
原帖由 sswroom 於 2017-8-20 10:24 AM 發表


我現在用HeapAlloc/HeapFree已經做到所需的東西, 只是在Linux上做不到相似的功能
還有不少其他Debug的功能Windows做到, Linux未找到方法做/做不到.....
用 HeapAlloc / HeapFree 係唔係即係自己整個 my_malloc() 入面再 call HeapAlloc() ?
如果係咁, 未即係加左 wrapper function, 3rd party library 冇 source code 又點 tracking ?
唔係好明成件事係點






引用:
原帖由 sswroom 於 2017-8-20 10:24 AM 發表


我現在用HeapAlloc/HeapFree已經做到所需的東西, 只是在Linux上做不到相似的功能
還有不少其他Debug的功能Windows做到, Linux未找到方法做/做不到.....
from #202
引用:
還有, 我現時寫的所有Program已經是能Cross-platform/Cross-CPU/Cross-Device, 同一段Source Code能在不同的Platform Compilie和Run
即係 non windows 得定唔得, 定我攪錯左






引用:
原帖由 jasonchan35 於 2017-8-20 10:32 AM 發表



用 HeapAlloc / HeapFree 係唔係即係自己整個 my_malloc() 入面再 call HeapAlloc() ?
如果係咁, 未即係加左 wrapper function, 3rd party library 冇 source code 又點 tracking ?
唔係好明成件事係點
我寫程式(Business Layer)的例子 (MD5Test):
複製內容到剪貼板
代碼:
#include "Stdafx.h"
#include "MyMemory.h"
#include "Core/Core.h"
#include "Crypto/Hash/MD5.h"
#include "IO/ActiveStreamReader.h"
#include "IO/ConsoleWriter.h"
#include "IO/FileStream.h"
#include "Text/MyString.h"

Crypto::Hash::IHash *hash;
IO::ConsoleWriter *console;
Int64 readSize;

void __stdcall OnDataHdlr(const UInt8 *buff, OSInt buffSize, void *userData)
{
        readSize += buffSize;
        hash->Calc(buff, buffSize);
}

Int32 MyMain(Core::IProgControl *progCtrl)
{
        NEW_CLASS(console, IO::ConsoleWriter());
        OSInt argc;
        WChar **argv = progCtrl->GetCommandLines(progCtrl, &argc);
        console->WriteLine(L"MD5 Calculation Test");
        if (argc < 2)
        {
                console->Write(L"Usage: ");
                console->Write(argv[0]);
                console->WriteLine(L" [File]");
        }
        else
        {
                Manage::HiResClock *clk;
                IO::FileStream *fs;
                IO::ActiveStreamReader *reader;
                UInt8 hashVal[16];
                WChar sbuff[40];
                NEW_CLASS(hash, Crypto::Hash::MD5());
                NEW_CLASS(clk, Manage::HiResClock());

                readSize = 0;
                NEW_CLASS(fs, IO::FileStream(argv[1], IO::FileStream::FILE_MODE_READONLY, IO::FileStream::FILE_SHARE_DENY_NONE, IO::FileStream::BT_NORMAL));
                if (fs->IsError())
                {
                        console->WriteLine(L"Error in opening file");
                }
                else
                {
                        Double t1;
                        Double t2;
                        NEW_CLASS(reader, IO::ActiveStreamReader(OnDataHdlr, 0, fs, 1048576));
                        t1 = clk->GetTimeDiff();
                        reader->ReadStream(0);
                        t2 = clk->GetTimeDiff();
                        DEL_CLASS(reader);

                        Text::StrInt64(sbuff, readSize);
                        console->Write(L"File Size: ");
                        console->WriteLine(sbuff);

                        console->Write(L"MD5: ");
                        hash->GetValue(hashVal);
                        Text::StrHexBytes(sbuff, hashVal, 16, 0);
                        console->WriteLine(sbuff);

                        Text::StrDouble(sbuff, t2 - t1);
                        console->Write(L"Time Used: ");
                        console->Write(sbuff);
                        console->WriteLine(L" seconds");

                        Text::StrDouble(sbuff, readSize / 1048576.0 / (t2 - t1));
                        console->Write(L"Data Rate: ");
                        console->Write(sbuff);
                        console->WriteLine(L" MiB/s");
                }
                DEL_CLASS(fs);

                DEL_CLASS(clk);
                DEL_CLASS(hash);
        }
        DEL_CLASS(console);
        return 0;
}
在這層Business Layer內, 基本上只會用API Layer的Data Type和API, 包括main function, 不會直接使用其他任何C/C++的API
Allocate Memory是用MemAlloc(dataType, count)
例:
複製內容到剪貼板
代碼:
UInt8 *buff = MemAlloc(UInt8, 1048576);
MemFree(buff);
P.S. 我的Debug Engine沒有Source也能Trace, Assembly Function也能Stack Trace, Windows的Stack Trace是不支援Assembly Functions



實用相關搜尋: 程式 支援 Call windows IT
[隱藏]
引用:
原帖由 jasonchan35 於 2017-8-20 10:34 AM 發表



from #202


即係 non windows 得定唔得, 定我攪錯左
Non Windows可以Compile, Execute, 只是部分功能不能用



實用相關搜尋: windows

回覆 引用 TOP

引用:
原帖由 sswroom 於 2017-8-20 10:50 AM 發表


我寫程式(Business Layer)的例子 (MD5Test):#include "Stdafx.h"
#include "MyMemory.h"
#include "Core/Core.h"
#include "Crypto/Hash/MD5.h"
#include "IO/ActiveStreamReader.h"
#include "IO/ConsoleWri ...
如果我無理解錯, 即係加左 macro wrapper NEW_CLASS / MemAlloc
如果係咁, 應該用 malloc 定 HeapAlloc 都一樣, 只要你有地方放 tracking information (filename, line no.)

我通常咁樣做個 wrapper
#define LOC MyLoc(__FILE__, __LINE__)

override new/delete

void* operator new  (size_t numBytes, const axSourceLoc& loc, axAllocator* allocator = nullptr)
void* operator new[](size_t numBytes, const axSourceLoc& loc, axAllocator* allocator = nullptr)
my_malloc(MyLoc loc, size_t size)
用既時候
new(LOC) MyClass(1,2,3);
my_malloc(LOC, sizeof(MyData))

分開 LOC, 因為可以係 function 外面 pass 入黎,
例如自己做既 std::vector
MyVector v;
v.resize(LOC, 100); // 咁 vector 入面要做 malloc() 可以用返依個 LOC,
如果唔係太多 malloc 係黎自 vector 之類 container



實用相關搜尋: 程式 mac
引用:
原帖由 jasonchan35 於 2017-8-20 11:07 AM 發表




如果我無理解錯, 即係加左 macro wrapper NEW_CLASS / MemAlloc
如果係咁, 應該用 malloc 定 HeapAlloc 都一樣, 只要你有地方放 tracking information (filename, line no.)

我通常咁樣做個 wrapper
#def ...
malloc 最大問題是分不出是否經Wrapper Allocate, 去到Check Memory Leaks時, 會找到很多不經Wrapper Allocate的Memory Block, 但程式沒有辦法去分是否經Wrapper Allocate, 因此產生很多問題



實用相關搜尋: 程式 mac
引用:
原帖由 sswroom 於 2017-8-20 11:19 AM 發表

malloc 最大問題是分不出是否經Wrapper Allocate, 去到Check Memory Leaks時, 會找到很多不經Wrapper Allocate的Memory Block, 但程式沒有辦法去分是否經Wrapper Allocate, 因此產生很多問題
你可以參考一下objective-c同swift嘅implement

兩個language 一樣係用malloc
但Xcode 可以分得出C malloc 、objective-c object 同swift object

也可以trace到晒同畫到 object reference graph 出來







回覆 引用 TOP

不過都可以講講

如果能夠dump memory 的來源的call stack

好似swift object咁
Call stack最終可以trace到一個swift slow alloc的function
Function 入面係再call malloc

也係一個分辨到wrapper malloc同普通malloc的手法



實用相關搜尋: Call

回覆 引用 TOP

伸延閱讀
 提示:支持鍵盤翻頁 ←左 右→
[按此隱藏 Google 建議的相符內容]
 





 

重要聲明:本討論區是以即時上載留言的方式運作,香港討論區對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意 見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們。香港討論區有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ), 同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權 。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。


Copyright©2003- Discuss.com.hk Limited. All Right Reserved.
版權所有,不得轉載。