0

C# では、次の種類のスタック トレースを取得します。

   at ExceptionGenerator.Program.three() in c:\Users\ADIMA\Documents\Visual Stud
io 2013\Projects\ExceptionGenerator\ExceptionGenerator\Program.cs:line 36
   at ExceptionGenerator.Program.two() in c:\Users\ADIMA\Documents\Visual Studio
 2013\Projects\ExceptionGenerator\ExceptionGenerator\Program.cs:line 31
   at ExceptionGenerator.Program.one() in c:\Users\ADIMA\Documents\Visual Studio
 2013\Projects\ExceptionGenerator\ExceptionGenerator\Program.cs:line 26
   at ExceptionGenerator.Program.Main(String[] args) in c:\Users\ADIMA\Documents
\Visual Studio 2013\Projects\ExceptionGenerator\ExceptionGenerator\Program.cs:li
ne 15

私はC++でかなり同じことをしたいのですが、2つのことがわかりません.ファイルと現在の行番号を取得するにはどうすればよいですか?

私がこれまでに取り組んできたコード例:

// StackTracing.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <Windows.h>
#include "dbghelp.h"

using namespace std;

int LogStackTrace()
{
    void            *stack[100];
    WORD            numberOfFrames;
    SYMBOL_INFO     *symbol;
    HANDLE          process;
    process = GetCurrentProcess();
    SymInitialize(process, NULL, TRUE);
    numberOfFrames = CaptureStackBackTrace(0, 1000, stack, NULL);
    symbol = (SYMBOL_INFO *)calloc(sizeof(SYMBOL_INFO)+256 * sizeof(char), 1); 
    symbol->MaxNameLen = 255;
    symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
    printf("Caught exception ");
    for (int i = 0; i < numberOfFrames; i++)
    {
        SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
        printf("at %s, address 0x%0X\n", symbol->Name, symbol->Address);
    }
    return 0;
}

void function2()
{
    throw new exception("Expected exception.");
}

void function1()
{
    function2();
}

void function0()
{
    function1();
}

static void threadFunction(void *param)
{
    try
    {
        function0();
    }
    catch (...)
    {
        LogStackTrace();
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        _beginthread(threadFunction, 0, NULL);
    }
    catch (...)
    {
        LogStackTrace();
    }
    printf("Press any key to exit.\n");
    cin.get();
    return 0;
}

出力:

Press any key to exit.
Caught exception at LogStackTrace, address 0xB13860
at threadFunction, address 0xB15680
at beginthread, address 0xFCF31E0
at endthread, address 0xFCF33E0
at BaseThreadInitThunk, address 0x7656494F
at RtlInitializeExceptionChain, address 0x772E986A
at RtlInitializeExceptionChain, address 0x772E986A
4

1 に答える 1

0

ここでスタック フレーム クラスが役立つかもしれません。

于 2014-03-17T18:41:47.937 に答える