Отладка содержимого общей памяти

0

У меня два процесса. В процессе A приложение Alpha готово для использования разделяемой памяти. В процессе B мое оконное приложение с основным методом обращается к этой общей памяти. Он работает, я могу подключиться к памяти. К сожалению, если я храню содержимое памяти в переменной (здесь pBuf) и проверяю переменную через MsVisualStudioDebugger, в буфере есть только одна буква - что пошло не так? Как я могу смотреть в память/файл, чтобы получить ключ, какие объекты хранятся в памяти? Заранее спасибо.

Вот код моего консольного приложения:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
using namespace std;
#define BUF_SIZE 256 
TCHAR szName[] = TEXT("SIMITSHM"); // Name des SHMs;
int main(void){
    std::cout << "*** start SharedMemory  ***\n";
    HANDLE hMapFile;
    LPCTSTR pBuf;
    hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);              
    if (hMapFile == NULL){
        MessageBox(NULL, TEXT("Could not open file mapping object"), TEXT("FEHLER"), MB_OK);
        return 1;
    }
    pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
    if (pBuf == NULL){
        MessageBox(NULL, TEXT("Could not map view of file"), TEXT("FEHLER"), MB_OK);
        CloseHandle(hMapFile);
        return 1;
    }
    MessageBox(NULL, pBuf, TEXT("SIMIT-SHM"), MB_OK); // content of memory
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    std::cout << "*** close app by typing a number. ***\n";
    int a = 0;
    cin >> a;
    return 0;
}

UPDATE: после проведения дополнительных исследований по этой проблеме, я думаю, проблема заключается в отливке возвращаемого значения MapViewOfFile() -function.

ОБНОВЛЕНИЕ-2: Спасибо, Ханс! Я смог посмотреть содержимое pBuf как hexdump, см.: Изображение 174551

ОБНОВЛЕНИЕ-3: Спасибо, Ханс! Благодаря вашим советам я смог использовать fwrite() для размещения содержимого общей памяти в файле на моей локальной машине. Более того, я могу видеть знакомые имена, такие как EingangMotor1, которые я настроил в приложении-Alpha, и кажется, что этот контент хранился в общей памяти. Теперь я надеюсь поиграть с приложением-Alpha, узнаю связанные изменения в общей памяти, а потом надеюсь, что я смогу изменить значения значений переменных разделяемой памяти, поэтому приложение-Alpha изменит свое поведение на лету. Изображение 174551

UPDATE-4: текущий код - заблаговременно заблаговременно за отзыв, какие линии необходимо улучшить.

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <strsafe.h>
#include <fstream>
#include <sstream>
#include <vector>
#pragma comment(lib, "user32.lib")
using namespace std;
#define BUF_SIZE 256 
TCHAR szName[] = TEXT("SIMITSHM"); // Name des SHMs;
int main(void){
    std::cout << "*** Start SharedMemory  ***\n";
    HANDLE hMapFile;
    FILE * pBuf;
    hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);              
    if (hMapFile == NULL){
        MessageBox(NULL, TEXT("Could not open file mapping object"), TEXT("ERROR"), MB_OK);
        return 1;
    }
    // MapViewOfFile return a pointer to void, so you need to cast it to a suitable structure 
    pBuf = (FILE*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
    if (pBuf == NULL){
        MessageBox(NULL, TEXT("Could not map view of file"), TEXT("ERROR"), MB_OK);
        CloseHandle(hMapFile);
        return 1;
    }
    // write file 
    FILE * pFile;
    pFile = fopen ("shm-main-simit-content-fwrite.txt","w");
    fwrite(pBuf, 50, 20, pFile);
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    std::cout << "*** close app by typing a number. ***\n";
    int a = 0;
    cin >> a;
    return 0;
} 
Теги:
window
shared-memory

1 ответ

1
Лучший ответ

Да, у вас, конечно, есть несоответствие типа. Этот файл вряд ли содержит корректную нуль-строку C. Использование макросов TCHAR добавляет к случайности, больше нет смысла их использовать. Последняя версия Unicode для Windows умерла 10 лет назад.

Отвечая на вопрос: используйте Debug + Windows + Memory + Memory 1 и поместите "pBuf" в поле "Адрес". Вы увидите шестнадцатеричный дамп содержимого разделяемой памяти.

  • 0
    Большое спасибо, Ганс! Я могу отладить pBuf и посмотреть на hexdump. Во всяком случае, я понятия не имею, что может сказать мне hexdump. Кроме того, что, по вашему мнению, является лучшим типом для приведения MapViewOfFile. Я хотел бы записать содержимое в файл.
  • 0
    Если вы хотите записать в файл, не читайте. Вы просматриваете все, что вам нравится, тип структуры является обычным.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню