279 char *
file =
"/proc/self/map";
280 char *resolve_pattern =
"/proc/self/path/%s";
282 char lastobject[PRMAPSZ];
289 caddr_t t_min, t_max, d_min, d_max;
294 SUBDBG(
"ENTERING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
304 memset( lastobject, 0, PRMAPSZ );
307 SUBDBG(
" -> %s: Preprocessing memory maps from procfs\n", __func__ );
312 while (
read(
fd, &mapping,
sizeof ( prmap_t ) ) > 0 ) {
314 SUBDBG(
" -> %s: Found a new memory map entry\n", __func__ );
320 if ( mapping.pr_mflags & ( MA_READ | MA_WRITE | MA_EXEC ) &&
321 !( mapping.pr_mflags & MA_ANON ) ) {
324 if ( strcmp( lastobject, mapping.pr_mapname ) != 0 ) {
325 strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
329 SUBDBG(
" -> %s: Memory mapping entry valid for %s\n", __func__,
330 mapping.pr_mapname );
336 SUBDBG(
" -> %s: Preprocessing done, starting to analyze\n", __func__ );
341 if (
lseek(
fd, 0, SEEK_SET ) == -1 ) {
345 memset( lastobject, 0, PRMAPSZ );
352 while (
read(
fd, &mapping,
sizeof ( prmap_t ) ) > 0 ) {
354 if ( mapping.pr_mflags & MA_ANON ) {
357 (
" -> %s: Anonymous mapping (MA_ANON) found for %s, skipping\n",
358 __func__, mapping.pr_mapname );
364 if ( strcmp( mapping.pr_mapname, lastobject ) != 0 ) {
366 SUBDBG(
" -> %s: Analyzing mapping for %s\n", __func__,
367 mapping.pr_mapname );
369 cur = &( pam[++position] );
370 strncpy( lastobject, mapping.pr_mapname, PRMAPSZ );
376 SUBDBG(
" -> %s: Resolved name for %s: %s\n", __func__,
377 mapping.pr_mapname, cur->
name );
381 if ( mapping.pr_mflags & MA_READ ) {
383 if ( mapping.pr_mflags & MA_WRITE ) {
386 (
caddr_t ) ( mapping.pr_vaddr + mapping.pr_size );
409 }
else if ( mapping.pr_mflags & MA_EXEC ) {
412 (
caddr_t ) ( mapping.pr_vaddr + mapping.pr_size );
456 SUBDBG(
" -> %s: Analysis of memory maps done, results:\n", __func__ );
457 SUBDBG(
" -> %s: text_start=%#x, text_end=%#x, text_size=%lld\n", __func__,
462 SUBDBG(
" -> %s: data_start=%#x, data_end=%#x, data_size=%lld\n", __func__,
474 SUBDBG(
"LEAVING FUNCTION >>%s<< at %s:%d\n", __func__, __FILE__,
ssize_t read(int fd, void *buf, size_t count)
off_t lseek(int fd, off_t offset, int whence)
PAPI_shlib_info_t shlib_info
int open(const char *pathname, int flags, mode_t mode)
PAPI_address_map_t address_info
#define PAPI_HUGE_STR_LEN
get the executable's address space info
#define SUBDBG(format, args...)
papi_mdi_t _papi_hwi_system_info
char fullname[PAPI_HUGE_STR_LEN]
char name[PAPI_HUGE_STR_LEN]
#define papi_calloc(a, b)